首页 > 解决方案 > C初始化的全局结构与未初始化的成员整数定义了beheviour?

问题描述

根据定义的行为,未初始化的全局 int 始终为 0,如果它不是全局的,则不正确。全局结构呢?做

struct s
{
    int a;
}instance;

int main()
{    
    printf("%d\n", instance.a);
    return 0;
}

总是打印0还是技术上未定义的行为?

标签: cc89

解决方案


对于全局结构,所有字段都将初始化为 0 / NULL。这在当前C 标准的第 6.7.9p10 节中有详细说明:

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

  • 如果是指针类型,则初始化为空指针;
  • 如果它具有算术类型,则将其初始化为(正或无符号)零;
  • 如果是聚合,则根据这些规则(递归)初始化每个成员,并将任何填充初始化为零位;
  • 如果是联合,则根据这些规则(递归)初始化第一个命名成员,并将任何填充初始化为零位;

旧的C89 标准在第 3.5.7 节中有类似的语言:

具有静态存储持续时间的对象未显式初始化,它被隐式初始化,就好像每个具有算术类型的成员都被分配了 0 并且每个具有指针类型的成员都被分配了一个空指针常量。如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的

...

如果聚合包含聚合或联合的成员,或者联合的第一个成员是聚合或联合,则规则递归地应用于子聚合或包含的联合

所以在你的情况下,instance.a保证设置为0。


推荐阅读