未被指定初始化器命名的字段会发生什么?

21
自 C99(和 C++20)以来,可以使用这种语法初始化结构体:
struct info
{
    char    name[8+1];
    int     sz;
    int     typ;
};

struct info  arr[] =
{
    [0] = { .sz = 20, .name = "abc" },
    [9] = { .sz = -1, .name = "" }
};

未指定的字段会发生什么?


2
我非常确定它们被初始化为0。但我也确信其他人会更快地找到使其成为可能的C99规范部分。...而且我是正确的! - torak
1个回答

34

它们被清零了。根据C99标准第6.7.8节(初始化)/21,

如果花括号内的初始化列表中元素或成员的数量少于聚合体的数量,或者用于初始化已知大小数组的字符串文字中的字符数少于数组中的元素数量,则剩余的聚合体将隐式地被初始化为具有静态存储期的对象一样。


恰好我想要知道的内容,并且还包括了标准引用。谢谢! - Matt Joiner
3
@Matt Joiner: 是否曾经有过任何怀疑?另外,为了完整起见,请参阅§6.7.8(初始化)/10,该条款有效地说明这样的静态存储将被NULL / 0初始化。 - torak
2
这个事实的一个有用的推论是,{0}是一种通用的零初始化器,可用于任何聚合类型(实际上,任何类型都可以,虽然某些编译器在用于简单类型时可能会给出警告)。 - R.. GitHub STOP HELPING ICE
@torak 我认为静态持续时间的浮点数被初始化为+0,因此C99§6.7.8中的原始句子是“如果它具有算术类型,则将其初始化为(正或无符号)零;”,也许我有点迂腐? - Allan Ruin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接