C:结构初始化数组的嵌套大括号是如何工作的?

zer*_*lus 12 c

struct mystruct s[10] = {{0}};
Run Code Online (Sandbox Code Playgroud)

这似乎将结构数组初始化为0.嵌套大括号语法如何工作?

xsc*_*ott 10

未指定的任何字段都初始化为零.所以这里有一系列结构.您正在使用结构初始化程序初始化数组的第一个元素,该结构初始化程序将结构的第一个元素初始化为零.第一个结构的其余部分和其余的数组元素也都是零.这是一个很好的习语.

  • 它确实有效果.它专门将第一个元素初始化为零,然后隐式地将其余元素初始化为零.如果省略{{0}},如果在函数内部(在堆栈上)声明它,则会得到随机垃圾.(请注意,如果您将此声明为全局并省略{{0}},则它也将初始化为零,但原因各不相同.) (4认同)

Don*_*alo 6

初始化的不是嵌套大括号。外面的大括号表示正在初始化数组:

struct mystruct s[10] = {           };
Run Code Online (Sandbox Code Playgroud)

由于这是一个结构数组,因此每个结构都可以使用更多大括号进行初始化:

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
};
Run Code Online (Sandbox Code Playgroud)

请注意,仅初始化前三个元素。根据 C 标准,其余 7 个元素必须初始化为 0。您的代码也会发生这种情况。正如 xscott 在他的回复中提到的,初始化列表中省略的所有内容都被初始化为 0。


Jon*_*ler 5

如图所示?

基本上,您应该将每种复合类型(数组,结构等)括在其自己的括号内。

考虑:

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
};
Run Code Online (Sandbox Code Playgroud)

但是,如果您坚持这样做,也可以省略括号(糟糕的,过时的做法):

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
};
Run Code Online (Sandbox Code Playgroud)

任何省略的初始化器均视为零。

  • 使用大括号的优点是它可以让您省略某些成员的部分初始化(然后将隐式初始化为零),同时继续初始化后面的成员。您对 `{'x', 'y', 'z' },` 的使用就是一个例子。 (2认同)