未初始化的全局变量在c中是否始终默认为0?

时间:2011-04-14 12:12:55

标签: c elf

我知道未初始化的全局变量在BSS段中被恢复,操作系统应该将其初始化为零。

但是应该而不是必须,而且我从未见过任何标准说未初始化的全局必须默认为零,所以是将此视为理所当然是安全的吗?

3 个答案:

答案 0 :(得分:5)

以下是C99 Standard Document条款6.7.8(第10段)的自动回答:

如果没有显式初始化具有自动存储持续时间的对象,则其值为 不定。如果未明确初始化具有静态存储持续时间的对象, 然后:

  • 如果它有指针类型,则将其初始化为空指针;
  • 如果它有算术类型,则初始化为(正数或无符号)零;
  • 如果是聚合,则根据这些规则初始化(递归)每个成员;
  • 如果它是一个联合,则根据这些初始化(递归)第一个命名成员 规则。

答案 1 :(得分:3)

C标准表示,没有显式初始化的静态存储持续时间(包括所有全局变量)的变量初始化为零。

其他语言,例如Fortran,有所不同。

答案 2 :(得分:0)

IIRC当然没有要求将未初始化的全局变量设置为零,我确信我已经听说过不是这种情况的情况。与往常一样,如果您害怕它是一个问题,请自行安全并始终自己初始化变量。

我个人试图从不将任何事情视为理所当然。它不仅可以明确地避免任何此类麻烦,而且还可以清楚地告诉其他任何人您正在阅读代码的情况。

编辑:我已经纠正了标准要求将全局变量初始化为零。只是为了澄清我上面的不良措辞,我并不是说绝对没有什么可以被视为理所当然(这是荒谬的),而是如果有一个简单而简洁的采取一些东西的方式是的,做到了。

我提倡这种方法的原因是因为尽管大多数程序员都可以依赖符合标准的编译器行为,但是我们有很多人在无论出于何种原因并不总是可能符合标准的环境中工作(微控制器的硬件限制是一个很好的例子,或者在评论中看到史蒂夫的例子​​。我还认为没有任何完全符合标准的编译器(除了在编译器定义标准的情况下)。

当我在文件中看到int myGlobal=0;时,我知道肯定 myGlobal的值为零。如果它只是声明为int myGlobal;,则标准表示 的值为零。这并不保证它,我相信输入额外的两个字符不会花费太大,提高程序的可读性,并且如果你发现你需要编译代码就增加了可移植性一个不预先初始化全局变量的平台。 是我的观点 - 为什么不呢,即使标准说你应该,你也可能只是掩饰自己。