用未定义的成员int定义行为的C初始化全局结构?

时间:2018-07-25 11:52:14

标签: c c89

根据定义的行为,未初始化的全局int始终为0,如果不是全局的,则为true。那么全局结构呢? 是

struct s
{
    int a;
}instance;

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

总是打印0还是技术上不确定的行为?

1 个答案:

答案 0 :(得分:3)

对于全局结构,所有字段都将初始化为0 / NULL。当前C standard的6.7.9p10节对此进行了详细说明:

  

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

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

旧的C89 standard在3.5.7节中具有类似的语言:

  

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

     

...

     

如果聚合包含作为聚合或联合的成员,或者   联盟的第一个成员是集合或联盟,规则适用   递归到子集合或包含的联合

因此,在您的情况下,保证instance.a设置为0。