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

| 我知道未初始化的全局变量将在BSS段中恢复,并且操作系统应将其初始化为零。 但这不是必须的,而且我从未见过任何标准说未初始化的全局必须默认为零,因此将其视为理所当然地安全吗?     
已邀请:
这是C99标准文档第6.7.8条(第10段)的自动回答: 如果具有自动存储期限的对象未显式初始化,则其值为 不定。如果具有静态存储持续时间的对象未明确初始化, 然后: 如果具有指针类型,则将其初始化为空指针; 如果具有算术类型,则将其初始化为(正数或无符号)零; 如果是聚合,则根据这些规则(递归)初始化每个成员; 如果它是一个联合,则根据这些初始名称(递归)初始化第一个成员 规则。     
C标准说,具有静态存储持续时间(包括所有全局变量)且未进行显式初始化的变量将初始化为零。 其他语言(例如Fortran)有所不同。     
IIRC当然没有要求将未初始化的全局变量设置为零,而且我确定我听说过并非如此的情况。与往常一样,如果您担心这是一个问题,请放心地使用它并始终自己初始化变量。 我个人试图永远不要将任何事情视为理所当然。明确地做到这一点不仅可以巧妙地规避任何此类麻烦,而且还可以使其他人在阅读您的代码时都可以预见。 编辑:自从我已经得到纠正,该标准确实要求将全局变量初始化为零。只是为了澄清我上面的措辞不佳,我并不是说绝对不会将任何事情都视为理所当然(这是荒谬的),而是如果有一种简单明了的方式将某些事情视为理所当然,那就它。 我之所以提倡这种方法,是因为尽管大多数程序员都可以依靠具有符合标准行为的编译器,但是我们当中有很多人都在由于某种原因而不一定总是符合标准的环境中工作(微控制器的硬件限制就是一个很好的例子。 ,或在评论中查看Steve的示例)。我还要指出的是,不存在完全符合标准的编译器(在那些由编译器定义标准的情况下除外)。 当我在文件中看到“ 0”时,我肯定知道“ 1”的值为零。如果仅将其声明为
int myGlobal;
,则标准表示该值也应为零。但这并不能保证一定会,并且我相信键入多余的两个字符不会带来太大的成本,而且可以提高程序的可读性,并且如果您发现确实需要在不使用此功能的平台上编译代码,则可以提高可移植性预初始化全局变量。这就是我的观点-为什么不这样做,即使标准说您应该没问题,您也可能会掩饰自己。     

要回复问题请先登录注册