我正在学习C中的内存布局,我在使用gcc从以下C代码编译的文件上使用了size命令

#include <stdio.h>
int main(){
    return 0;
}

I got this result enter image description here

执行相同的操作,但在主函数之前添加了一个未初始化的int

int x;
int main ...

size命令的输出相同

我知道未初始化的变量会进入内存中的bss部分,所以第二个代码应该给我一个不同的bss大小(8+4=12字节)

数据和bss部分中最初存储了什么(其初始大小分别为512和8字节)?

推荐答案

C编译器通常会优化代码,除非你告诉他们不要这样做.

根据经验,您创建但随后未引用的任何函数或变量都将得到优化.在本例中,您的int x;随后从未被引用,因此编译器只是忽略了它.

例如,如果您在main()函数中使用return x;作为最终语句,那么它将引用x.编译器将不得不在.bss中为其分配空间,因为您没有显式分配值,也没有声明为static*.

不过,请记住,.bss件物品本质上是虚拟的.它们已声明但未实例化.换句话说,记帐已经完成,在执行时,空间将最终分配到内存中,但它们不会占用可执行文件中的物理空间.

注意:.bss段通常在执行时归零,but this is not guaranteed behaviour,您不应该依赖它.换句话说,你的x可能会有所不同!


(* If you had assigned a non-zero value, that would put it in the 100 segment. If you had assigned a zero value, or declared it static without an initialiser, it would be put in a segment that would be guaranteed zeroed at execute time, or in 100.)

C++相关问答推荐

C sscanf没有捕获第二个参数

Mise()在虚拟内存中做什么?

在C语言中使用scanf()时我无法理解的警告

如何正确地索引C中的 struct 指针数组?

为什么输出不是从上到下C

空指针的运行时强制转换

将fget()与strcMP()一起使用不是正确的比较

向上强制转换C中的数值类型总是可逆的吗?

如何捕捉只有换行符或空格字符缓冲区的边缘大小写

如何在C语言中正确打印图形

如何使解释器存储变量

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

Vcpkg的配置文件

我可以创建适用于不同endian的 colored颜色 struct 吗?

为什么Linux无法映射这个PT_LOAD ELF段?

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

Linux/C:带有子进程的进程在添加waitid后都挂起

将char*铸造为空**

一元运算符

仅使用其内存地址取消引用 C 中的 struct