根据 C 标准,int 类型的未初始化全局变量的值始终为 0。
如果变量不是全局变量,则情况不成立,但是全局结构呢?
在以下示例中:
struct s
{
int a;
}instance;
int main()
{
printf("%d\n", instance.a);
return 0;
}
程序是否总是打印
0
还是技术上未定义的行为?
对于全局结构体,所有字段都将被初始化为 0 / NULL。 当前 C 标准第 6.7.9p10 节对此进行了详细介绍:
如果一个有自动存储期限的对象没有初始化 明确地,它的值是不确定的。如果一个物体具有静态 或者线程存储持续时间没有显式初始化,那么:
- 如果是指针类型,则初始化为空指针;
- 如果是算术类型,则初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则(递归地)初始化每个成员,并且任何填充都初始化为零位;
- 如果是联合体,则根据这些规则(递归地)初始化第一个命名成员,并初始化任何填充 为零位;
旧的C89标准在第3.5.7节中有类似的语言:
具有静态存储持续时间的对象未初始化 显式地,它是隐式初始化的,就好像每个成员都有 算术类型被分配为 0 并且每个具有指针类型的成员 被分配了一个空指针常量。如果一个对象具有自动 存储持续时间未显式初始化,其值为 不确定
...
如果聚合包含聚合或联合的成员,或者如果 联合的第一个成员是聚合或联合,规则适用 递归到子聚合或包含的联合
所以在你的情况下,
instance.a
保证设置为0。