我有一组结构,定义如下:
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[]
变量初始化为零吗?
它似乎正在处理我的编译器,但我想知道这是否是标准行为。
答案 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的编译器中使用指定的初始值设定项。