C初始化的全局结构,其中未初始化的成员Int由beheviour定义?

C初始化的全局结构,其中未初始化的成员Int由beheviour定义?,c,c89,C,C89,根据定义的beheviour,未初始化的全局int始终为0,如果它不是全局的,则不是真的。那么全局结构呢? 做 始终打印0,或者它在技术上未定义?对于全局结构,所有字段都将初始化为0/NULL。本手册第6.7.9p10节对此进行了详细说明: 如果未初始化具有自动存储持续时间的对象 显然,它的值是不确定的。如果对象具有静态 或者线程存储持续时间未显式初始化,则: 如果有指针类型,则初始化为空指针 如果它有算术类型,则初始化为(正或无符号)零 如果它是一个聚合,则根据这些规则(递归地)初始化每个成

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


始终打印
0
,或者它在技术上未定义?

对于全局结构,所有字段都将初始化为0/NULL。本手册第6.7.9p10节对此进行了详细说明:

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

  • 如果有指针类型,则初始化为空指针
  • 如果它有算术类型,则初始化为(正或无符号)零
  • 如果它是一个聚合,则根据这些规则(递归地)初始化每个成员,并将任何填充初始化为零位
  • 如果是联合,则根据这些规则(递归地)初始化第一个命名成员,并初始化任何填充 零位
旧版本在第3.5.7节中有类似的语言:

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

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


因此,在您的例子中,
instance.a
保证设置为0。

全局(和静态)变量初始化为0,是的。可能有一个复制品。是的。请回答下一个问题;)这不是未定义的行为。全局变量和静态变量的可能重复项总是用0初始化,不管它是
struct
s、数组还是简单变量(例如
char
int
等)。谢谢!你的摘录很好地解释了这一点。在阅读
之前,我有点被C99经常引用的段落和C89标准中的CTRL+F弄糊涂了。如果列表中的初始值设定项少于聚合的成员,则聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同只是被语言和C99在等效段落中使用的“大括号封闭列表”弄糊涂了。
struct s
{
    int a;
}instance;

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