C/C++中的内存分配
memory allocation in C/C++
当您在C或C++中声明int类型的变量x时,我知道它将占用4字节的内存。因此,为该变量分配了4个内存地址。我的问题是,我能看到分配给这个变量的所有四个内存地址吗?我知道这不是一个典型的问题,但我很好奇。或者它100%总是仅仅是存储器地址&x和接下来的3位?所以,如果它是内存地址1000,那么下一个将是1001、1002和1003?它是否偏离了这一点?
也可以说我设置x=5;
这是否意味着在这个存储器位置1000到1002中,它将被零填充,而在1003中,在最右边的位置有一个101(5的二进制表示)?
感谢
int
可以是四个字节,但这实际上取决于编译器。因此,为什么会有特定的大小类型,如uint32_t
。但为了论证起见,我们假设您的int
是四个字节。
是的,这四个字节是连续的。因此,&x
和接下来的三个字节是变量的位置,这是正确的。
然而,您假设最右边的字节是最不重要的,这只适用于big-endian机器。在小端序体系结构(如x86)上,最左边的字节将包含101
来表示数字5。
int的大小并不总是4个字节,只知道
char <= short <= int <= long <= long long
你可以像这个一样遍历int的每个字节
#include <stdio.h>
void main() {
int A = 10;
int *intPtr;
char *charPtr;
size_t size = sizeof(int);
size_t i;
intPtr = &A;
printf("%dn", *intPtr);
charPtr = (char*) intPtr;
for (i = 0; i < size; i++) {
printf("%dn", *(charPtr++));
}
}
几个不准确之处:
-
int
的大小取决于平台(尽管在大多数情况下它实际上是4个字节)。 -
你说的"看地址"是什么意思?如果你想通过调试器观察它,那么就继续吧,你很可能也会看到相邻的地址。如果您想访问
int
变量中的特定地址,那么可以使用char
指针轻松访问:int x = 5;
char* p = (char*)&x;
您可以使用
p[i]
访问0<=i<=sizeof(int)-1
范围内的任何地址。 -
地址1000-1003的内容取决于底层硬件架构的端序:
- 在Big Endian处理器上,内容(从低地址到高地址)将为0 0 5
- 在Little Endian处理器上,内容(从低地址到高地址)将为5 0 0 0
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配