0

为什么静态变量被赋值为0?

4

3 回答 3

2

因为标准要求这是真的。

C99 标准的 §6.7.8.10 说:

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

— 如果它具有指针类型,则将其初始化为空指针;

— 如果它具有算术类型,则将其初始化为(正或无符号)零;

— 如果是聚合,则每个成员都根据这些规则(递归地)初始化;

— 如果是联合,则根据这些规则(递归地)初始化第一个命名成员。

于 2013-02-12T07:39:01.347 回答
2

初始化为 0 是有意义的——它使事情变得更可预测。问题可能应该是“为什么堆栈变量没有初始化?”

这个问题的答案可能是性能 - 每次进入函数时都需要初始化堆栈变量,如果实际上不需要初始化,这可能会浪费时间。静态变量是在加载程序的时候初始化的,所以开销不大。

于 2013-02-12T07:42:31.240 回答
1

因为它们是唯一可以初始化而不会导致运行时性能损失的变量存储类。

自动存储类变量(默认值)未初始化,因为它们可能不会被使用。在第一次调用函数之前,不能保证函数的静态变量被初始化。

零是一个合理的通用默认初始化器,原因如下:在 char 数组上,它产生一个空字符串,它启动一个数组索引计数,并产生一个 NULL 指针,等等。

就我个人而言,我总是明确地初始化静态,甚至为零。这部分是纪录片,换句话说“我真的想要零,不要改变它”。

于 2013-02-12T07:53:17.550 回答