struct mystruct s[10] = {{0}};
这似乎将结构数组初始化为0.嵌套大括号语法如何工作?
xsc*_*ott 10
未指定的任何字段都初始化为零.所以这里有一系列结构.您正在使用结构初始化程序初始化数组的第一个元素,该结构初始化程序将结构的第一个元素初始化为零.第一个结构的其余部分和其余的数组元素也都是零.这是一个很好的习语.
初始化的不是嵌套大括号。外面的大括号表示正在初始化数组:
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。
如图所示?
基本上,您应该将每种复合类型(数组,结构等)括在其自己的括号内。
考虑:
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
};
任何省略的初始化器均视为零。