我知道未初始化的全局变量在BSS段中被恢复,操作系统应该将其初始化为零。
但是应该而不是必须,而且我从未见过任何标准说未初始化的全局必须默认为零,所以是将此视为理所当然是安全的吗?
答案 0 :(得分:5)
以下是C99 Standard Document条款6.7.8(第10段)的自动回答:
如果没有显式初始化具有自动存储持续时间的对象,则其值为 不定。如果未明确初始化具有静态存储持续时间的对象, 然后:
答案 1 :(得分:3)
C标准表示,没有显式初始化的静态存储持续时间(包括所有全局变量)的变量初始化为零。
其他语言,例如Fortran,有所不同。
答案 2 :(得分:0)
我个人试图从不将任何事情视为理所当然。它不仅可以明确地避免任何此类麻烦,而且还可以清楚地告诉其他任何人您正在阅读代码的情况。
编辑:我已经纠正了标准做要求将全局变量初始化为零。只是为了澄清我上面的不良措辞,我并不是说绝对没有什么可以被视为理所当然(这是荒谬的),而是如果有一个简单而简洁的不采取一些东西的方式是的,做到了。
我提倡这种方法的原因是因为尽管大多数程序员都可以依赖符合标准的编译器行为,但是我们有很多人在无论出于何种原因并不总是可能符合标准的环境中工作(微控制器的硬件限制是一个很好的例子,或者在评论中看到史蒂夫的例子。我还认为没有任何完全符合标准的编译器(除了在编译器定义标准的情况下)。
当我在文件中看到int myGlobal=0;
时,我知道肯定 myGlobal
的值为零。如果它只是声明为int myGlobal;
,则标准表示 的值为零。这并不保证它将,我相信输入额外的两个字符不会花费太大,提高程序的可读性,并且如果你发现你需要编译代码就增加了可移植性一个不预先初始化全局变量的平台。 那是我的观点 - 为什么不呢,即使标准说你应该,你也可能只是掩饰自己。