初始化后未初始化的全局变量的位置在哪里?

初始化后未初始化的全局变量的位置在哪里?

问题描述:

我在学习时遇到了一些小问题。我知道C中未初始化的全局变量被分配给可执行ELF文件中的.bss节。但是当我开始使用它们时会发生什么? 也就是说他们是否在堆上或其他地方找到位置?初始化后未初始化的全局变量的位置在哪里?

我试图通过打印(仍然未初始化)全局变量与

printf("%x",&glbl); 

地址总是返回相同的值0x80495bc,找出...为什么呢?

+1

我注意到,在问问题5分钟后你接受了答案。如果您将其打开一段时间,您将获得更多答案,因为人们将更有动力去改进答案。 – Adriaan 2009-08-11 13:37:54

+0

谢谢你的提示,下次我肯定会这么做。 – Patrick 2009-08-11 13:42:06

当操作系统加载你的程序时,它会从程序的地址空间分配足够的存储空间来存储.bss段中的所有内容,并将所有内存填满。当您分配,读取或获取变量的地址时,您正在操作分配的内存以提供.bss节的存储空间。

+0

啊,这也解释了为什么未初始化的全局变量包含的值总是为零。谢谢! – Patrick 2009-08-11 13:43:49

+0

一些编译器/体系结构支持小数据的SBSS部分。这通常是作为优化来完成的,以便可以通过从SBSS部分开始索引来获取数据。这通常可以通过使用gp寄存器和16位索引来完成 – zebrabox 2009-08-11 14:21:15

全局变量总是获得静态内存,如果它们未初始化,则它们在二进制文件中没有空间,但是当二进制文件加载到进程内存空间时,它们会在内存中获取它。

BSS是以可执行文件(或ELF)格式定义的占位符。所以它不占用磁盘空间,但仅指定链接器或加载器应分配的内存区域。

确切的操作取决于操作系统。既然你提到了ELF,我认为它适用于嵌入式系统。如果您为ROMmable代码构建,则链接器cmd文件会将BSS映射到静态地址区域。

如果您为操作系统(例如Linux)构建,则操作系统的加载程序将执行重定位过程,在该过程中,它将以可执行格式标记为相对的所有位置映射到内存中的物理或逻辑位置。

因为你提到的总是看到相同的值,这表明该过程对于你的系统是可重复的。当您更改链接程序文件(即地址区域),链接顺序(即模块将以不同的顺序获取指定的空间)或操作系统时,预计会看到更改。

无论您使用BSS值还是不使用BSS值,地址对于您运行的过程都保持不变。

该BSS部分在进程地址空间中被赋予一个内存块,就像代码和堆栈部分(以及任何其他ELF可能具有的那样)。一旦出现,他们不会在任何地方。加载程序安排事物,然后调用过程入口点。