堆栈和堆地址

时间:2011-09-14 12:12:03

标签: c memory-management

我在C中尝试在堆栈和堆上进行简单的内存分配。

int x = 2;
int *y = malloc(sizeof(int));

当我查看堆栈上x的地址和y中包含的堆地址时,我看到以下

x stack address : 0xbfe92bb4
heap address in y : 0x 9c4b008

这些地址是否采用不同的格式(因为我在这两种地址中看不到相同的数字十六进制字符)?

3 个答案:

答案 0 :(得分:5)

通常的程序模型中有三种主要的分配类型:

  • 静态 - 主要用于全局/静态变量 - 它在程序加载时分配(通常在编译时预定义的内存地址,具体取决于程序加载模型)。
  • 堆 - 动态分配(例如malloc或new),有时会有多个“内存池”从中进行分配
  • 堆栈 - 主要用于局部变量和函数参数

最后两种类型是允许某种动态分配(以非常不同的方式实现和使用)的类型,它们通常是从不同区域分配的(特别是在支持虚拟内存可能意味着非常不同的地址的情况下) )或从同一区域的不同端(两种记忆的分配向中间进展)。

您的情况只是不同的内存区域(堆地址应该读取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区域由进程中的所有共享库和动态加载的模块共享。

继续wikipedia

进行调查

答案 2 :(得分:1)

malloc位于堆上,这是与堆栈不同的内存区域。

不同的格式不是格式上的差异,而只是存储器存在的进程空间中的一个事实,这部分取决于编译器和分配时的OS的决定malloc的堆空间。

另请参阅this question,其中包含更多详细信息。