初始化嵌套结构而不定义所有字段

e.J*_*mes 2 c struct nested initialization

我有一组结构,定义如下:

typedef struct
{
    int index;
    int array[10];
}
Item;

typedef struct
{
    Item A;
    Item B;
    Item C;
}
Collection;
Run Code Online (Sandbox Code Playgroud)

我想声明一个类型的变量,Collection如下所示:

Collection collection =
{
    { 1, 0 },  /* item A */
    { 2, 0 },  /* item B */
    { 3, 0 }   /* item C */
};
Run Code Online (Sandbox Code Playgroud)

这会将三个index变量设置为1,2和3,同时将所有三个array[]变量初始化为零吗?

它似乎正在我的编译器上工作,但我想知道这是否是标准行为.

sth*_*sth 7

零周围应该有额外的大括号,以使它们成为有效的数组初始值设定项:

Collection collection =
{
    { 1, {0} },  /* item A */
    { 2, {0} },  /* item B */
    { 3, {0} }   /* item C */
};
Run Code Online (Sandbox Code Playgroud)

除此之外,它将正确初始化结构.

inizializer在没有附加大括号的情况下也是有效的,但是如果明确了子聚合的初始化程序,那么您将获得编译器警告并且更加容易混淆.有关详细信息,请参阅C99标准中的6.7.8部分,该部分在答案中特别提到,特别是6.7.8(20)和6.7.8(29)中的例子.