c - 为什么全局变量存储在堆中?

标签 c memory-management heap-memory segment data-segment

为什么在下面的例子中全局变量存储在堆段,而不是数据/bss段?

从映射伪文件的以下输出来看,data/bss 段是第 3 行。这是因为它是读/写的,并且是匿名的。以下 2 个条目是堆(如标签所示)。

这是/proc//maps 的输出:

00400000-00405000 r-xp 00000000 08:02 17962770                       myexec
00604000-00605000 r--p 00004000 08:02 17962770                       myexec
00605000-00606000 rw-p 00005000 08:02 17962770                       myexec
00606000-00607000 rw-p 00000000 00:00 0                              [heap]
00607000-00642000 rw-p 00000000 00:00 0                              [heap]
7ffff7a15000-7ffff7bd0000 r-xp 00000000 08:02 22282470               ..libc2.19.so
7ffff7bd0000-7ffff7dcf000 ---p 001bb000 08:02 22282470               ..libc-.19.so
7ffff7dcf000-7ffff7dd3000 r--p 001ba000 08:02 22282470               ..libc-.19.so
7ffff7dd3000-7ffff7dd5000 rw-p 001be000 08:02 22282470               ..libc-.19.so
7ffff7dd5000-7ffff7dda000 rw-p 00000000 00:00 0 
7ffff7dda000-7ffff7dfd000 r-xp 00000000 08:02 22282466               ..ld-2.19.so
7ffff7fec000-7ffff7fef000 rw-p 00000000 00:00 0 
7ffff7ff6000-7ffff7ff7000 rw-p 00000000 00:00 0 
7ffff7ff7000-7ffff7ffa000 rw-p 00000000 00:00 0 
7ffff7ffa000-7ffff7ffc000 r-xp 00000000 00:00 0                       [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00022000 08:02 22282466                ..ld-2.19.so
7ffff7ffd000-7ffff7ffe000 rw-p 00023000 08:02 22282466                ..ld-2.19.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0 
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                       [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0               [vsyscall]

但是,当我打印 2 个全局变量的位置时,我得到以下属于堆 vm 区域的地址:

glb1:6061b0 glb2:6061c0

我使用以下方式打印位置:

printf("glb1:%lx glb2:%lx\n", (uint64_t) &glb1, (uint64_t) &glb2);

最佳答案

BSS/DATA 是具有所有全局定义变量的段,默认情况下初始化为特定值或零。该段是可执行镜像的一部分。

堆“段”只是将在程序加载时分配的额外存储的数量。它不包含在图像中。此数量位于 BSS/DATA 段的末尾。

因此 BSS/DATA 和堆段具有相同的基地址。将堆段视为虚拟的/作为镜像的 bss/数据段的虚拟扩展。

最后,请注意,堆栈“段”通常会再次添加到此数量,并且当堆增长时,堆栈会下降。 (这可能取决于编译器。)

关于c - 为什么全局变量存储在堆中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29681712/

相关文章:

c# - 在 C# 中编码一个 char**

java - 如何在1个案例陈述中使用两个要求

swift - 惰性初始化和保留周期

iphone - ivars 的另一个内存管理查询

c++ boost进程间交换(复制)非共享和共享字符串 vector

c - clang 试图优化这个简单的递归算法是什么?

c - for(;;) 是什么意思?

c++ - 使用 vector 时出现奇怪的运行时错误

c# - WPF 每次打开和关闭窗口时增加内存

c++ - C++ 中的动态数组(指针数组还是新数组?)