我在C中尝试在堆栈和堆上进行简单的内存分配。
int x = 2;
int *y = malloc(sizeof(int));
当我查看堆栈上x的地址和y中包含的堆地址时,我看到以下
x stack address : 0xbfe92bb4
heap address in y : 0x 9c4b008
这些地址是否采用不同的格式(因为我在这两种地址中看不到相同的数字十六进制字符)?
答案 0 :(得分:5)
通常的程序模型中有三种主要的分配类型:
最后两种类型是允许某种动态分配(以非常不同的方式实现和使用)的类型,它们通常是从不同区域分配的(特别是在支持虚拟内存可能意味着非常不同的地址的情况下) )或从同一区域的不同端(两种记忆的分配向中间进展)。
您的情况只是不同的内存区域(堆地址应该读取0x09c4b008但输出中的0会丢失)。
答案 1 :(得分:4)
变量存储在不同的内存段中。
数据强> 数据区包含初始化的程序使用的全局变量和静态变量。该段可以进一步分类为初始化的只读区域和初始化的读写区域。例如,在C中由char s [] =“hello world”定义的字符串和在“main”之外的类似int debug = 1的C语句将存储在初始化的读写区域中。并且像const char * string =“hello world”这样的C语句使字符串文字“hello world”存储在初始化的只读区域中,字符指针变量字符串存储在初始化的读写区域中。例如:static int i = 10将存储在数据段中,global int i = 10将存储在数据段
中<强>堆强> 堆区域从BSS段的末尾开始,并从那里增长到更大的地址。堆区域由malloc,realloc和free管理,可以使用brk和sbrk系统调用来调整其大小(请注意,使用brk / sbrk和单个“堆区域”不需要履行合同malloc / realloc / free;它们也可以使用mmap实现,以将可能不连续的虚拟内存区域保留到进程的“虚拟地址空间”中。 Heap区域由进程中的所有共享库和动态加载的模块共享。
进行调查答案 2 :(得分:1)
malloc位于堆上,这是与堆栈不同的内存区域。
不同的格式不是格式上的差异,而只是存储器存在的进程空间中的一个事实,这部分取决于编译器和分配时的OS的决定malloc的堆空间。
另请参阅this question,其中包含更多详细信息。