struct mystruct s[10] = {{0}};
这似乎将结构数组初始化为0.嵌套大括号语法如何工作?
答案 0 :(得分:10)
未指定的任何字段都初始化为零。所以这里有一系列结构。您正在使用结构初始化程序初始化数组的第一个元素,该结构初始化程序将结构的第一个元素初始化为零。第一个结构的其余部分和其余的数组元素也都是零。这是一个很好的习语。
答案 1 :(得分:4)
如图所示?
基本上,你应该将每个复合类型 - 数组,结构等 - 包含在它自己的括号内。
考虑:
struct mystruct
{
int i;
double d;
char s[10];
int a[5];
} s[10] =
{
{ 0, 0.0, "abc", { 1, 2, 3, 4, 5 } },
{ 1, 1.0, "def", { 2, 3 } }, // Partially initialized array
{ 2, 2.0, { 'x', 'y', 'z' }, { 0 } }, // Strings are a shorthand
[9] = { 9, 99, 0, { 9, 8, 7, 6, 5 } }, // C99 - initialize row 9
};
但如果你坚持(糟糕的,过时的练习),你也可以省略括号:
struct mystruct t[3] =
{ // You cannot avoid using these outside braces
0, 0.00, "abc", 1, 2, 3, 4, 5, // Omitted braces
1, 1.11, "bcd", 2, 3, 4, 5, 4,
2, 2.34, // Omitted values
};
任何省略的初始值设定项都被视为零。
答案 2 :(得分:3)
初始化的不是嵌套大括号。外括号表示正在初始化数组:
struct mystruct s[10] = { };
由于这是一个结构数组,因此可以使用更多大括号初始化每个结构:
struct mystruct { int x, y, z};
struct mystruct s[10] = { {0, 1, 2}, // <-- initializes s[0].x, s[0].y, s[0].z
{1, 2, 3}, // <-- initializes s[1].x, s[1].y, s[1].z
{2, 3, 4} // <-- initializes s[2].x, s[2].y, s[2].z
};
请注意,只初始化了前三个元素。根据C标准,其余7个元素必须初始化为0.这也是您的代码所发生的事情。正如xscott在他的回复中提到的,初始化列表中省略的所有内容都被初始化为0。
答案 3 :(得分:0)
值得注意的是,虽然内部大括号是可选的,但编译器会检查以确保仅在它们应该的位置出现开括号,并且没有嵌套的项具有太多的初始化器。此外,可能会遗漏一些结构的字段并让编译器自动将它们归零,即使结构不在数组的末尾。请注意,实现方式的处理效率各不相同;有些人会将初始化记录分成小块,而有些则只会在代码中插入大量的零。例如,如果每个结构看起来像:
typedef struct { char name[8]; char more_stuff[1016]; } THINGIE; THINGIE my_array = {{"Fred"},{"George"},{"Mark"}};
一些编译器会生成3K值的const数据,而其他编译器会生成三个相对较小的'const-init'记录。