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