我正在机器上进行一些测试,我意识到,当我不初始化变量时,其值通常为0,但是当代码被编译为64位时,它仅使用0进行初始化,经过一些测试,我确认似乎是二进制文件的加载程序以0值填充了内存地址,而不是编译器。我想确认是否实际上是加载程序,将值0表示感谢
#include <stdio.h>
int x; //section .bss
int main(void) {
printf("%d\n", x);
return 0;
}
答案 0 :(得分:4)
我正在计算机上进行一些测试,我意识到当我这样做时 不初始化变量,其值通常为0,
如果定义了具有静态存储持续时间的变量(例如x
)而没有初始化程序,则其初始值为0(算术类型)或空指针(指针类型),否则为聚合类型及其成员根据这些规则(递归)进行初始化,或者它是联合类型,并且其第一个成员根据这些规则进行初始化。这是由语言标准的paragraph 6.7.9/10指定的,因此在符合标准的实施中,“趋于成为”太弱了。
但是请注意,这不适用于自动变量(那些在块作用域中声明且没有存储类说明符的变量)。如果在没有初始化程序的情况下声明了自动变量,则其初始值是不确定的,并且如果您在未事先设置的情况下使用此类对象的值,则行为是不确定的。也许这就是为什么您对冲。
但这只是 当代码编译为64位时,初始化为0,
如果我们谈论的是一致性实现,那么目标体系结构的字长与之无关。
一些之后 测试中,我验证了它似乎是二进制文件的加载器 用值0(而不是编译器)填充内存地址。
这取决于实现。 C没有指定。但是,您标记了ELF,并且以ELF为目标的C实现通常将默认初始化的对象分配给BSS部分,这是专门为此目的而设计的。 BSS不会占用磁盘空间,但在加载时会初始化为全零位。
我想要 确认是否实际上是加载程序将值0表示感谢
程序加载器,无论采用任何给定实现形式,均以静态持续时间设置每个变量的初始值,而不管其是否由初始化程序定义。它可以通过从磁盘加载值来实现,或者在某些情况下可以零填充而不从磁盘加载特定值,也可以通过其他机制来实现。如前所述,对于分配给ELF对象的BSS部分的变量,加载器(在这种情况下为动态链接器)对表示进行零填充。