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

时间:2010-10-07 16:26:05

标签: c

struct mystruct s[10] = {{0}};

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

4 个答案:

答案 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'记录。