2

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

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

4

3 回答 3

5

这是C99 标准文档第 6.7.8条(第 10 段)的权威答案:

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

  • 如果是指针类型,则初始化为空指针;
  • 如果它具有算术类型,则将其初始化为(正或无符号)零;
  • 如果是聚合,则每个成员都根据这些规则(递归地)初始化;
  • 如果它是一个联合,则根据这些规则(递归地)初始化第一个命名的成员。
于 2011-04-14T12:26:30.490 回答
3

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

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

于 2011-04-14T12:14:43.223 回答
0

IIRC当然没有要求将未初始化的全局变量设置为零,我敢肯定我听说过情况并非如此。与往常一样,如果您担心它会成为问题,请务必安全并始终自己初始化变量。

我个人尽量不要把任何事情视为理所当然。使其明确化不仅可以巧妙地规避任何此类麻烦,而且还可以让其他阅读您的代码的人清楚地了解您所期望的情况。

编辑:我已经得到纠正,标准确实要求将全局变量初始化为零。只是为了澄清我上面糟糕的措辞,我并不是说绝对没有什么可以被认为是理所当然的(这很荒谬),而是如果有一种简单而简洁的方法可以把某事视为理所当然,那就去做吧。

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

当我int myGlobal=0;在文件中看到时,我确定myGlobal的值为零。如果它只是被声明为int myGlobal;,则标准规定它的值也应该为零。这并不能保证它,而且我相信输入额外的两个字符不会有太大的成本,增加程序的可读性,并且如果你发现你确实需要在一个不预先编译的平台上编译代码-初始化全局变量。就是我的观点——为什么不呢,即使标准说你应该没问题,你也可能只是掩饰自己。

于 2011-04-14T12:15:07.767 回答