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

时间:2010-01-29 20:24:11

标签: c struct initialization nested

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

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

typedef struct
{
    Item A;
    Item B;
    Item C;
}
Collection;

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

Collection collection =
{
    { 1, 0 },  /* item A */
    { 2, 0 },  /* item B */
    { 3, 0 }   /* item C */
};

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

它似乎正在处理我的编译器,但我想知道这是否是标准行为。

2 个答案:

答案 0 :(得分:7)

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

Collection collection =
{
    { 1, {0} },  /* item A */
    { 2, {0} },  /* item B */
    { 3, {0} }   /* item C */
};

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

inizializer在没有附加大括号的情况下也是有效的,但是你会得到编译器警告,如果明确了子聚合的初始化程序,它就不那么容易混淆了。有关详细信息,请参阅C99标准中第6.7.8节,他在答案中特别提及,特别是6.7.8(20)和6.7.8(29)中的例子。

答案 1 :(得分:4)

这符合标准。请参阅 - 6.7.8初始化部分。此外,您可以在符合C99的编译器中使用指定的初始值设定项。