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

C:结构初始化数组的嵌套大括号是如何工作的?,c,C,这似乎将结构数组初始化为0。嵌套大括号语法是如何工作的?任何未指定的字段都初始化为零。这里有一个结构数组。您正在使用结构初始化器初始化数组的第一个元素,该结构初始化器将结构的第一个元素初始化为零。第一个结构的其余部分和数组元素的其余部分也都将为零。这是一个很好的习惯用法。初始化的不是嵌套的大括号。外部大括号表示正在初始化数组: struct mystruct s[10] = {{0}}; 由于这是一个结构数组,每个结构都可以使用其他大括号进行初始化: struct mystruct s[10]

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

任何未指定的字段都初始化为零。这里有一个结构数组。您正在使用结构初始化器初始化数组的第一个元素,该结构初始化器将结构的第一个元素初始化为零。第一个结构的其余部分和数组元素的其余部分也都将为零。这是一个很好的习惯用法。

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

struct mystruct s[10] = {{0}};
由于这是一个结构数组,每个结构都可以使用其他大括号进行初始化:

struct mystruct s[10] = {           };
struct mystruct{intx,y,z};
struct mystruct s[10]={{0,1,2},//如图所示

基本上,您应该将每个复合类型(数组、结构等)封装在它自己的大括号级别中

考虑:

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
};
但如果你坚持的话,你也可以省略大括号(糟糕的,过时的做法):


任何省略的初始值设定项都被视为零。

需要注意的是,虽然内部大括号是可选的,但编译器将检查以确保打开的大括号只出现在它们应该出现的地方,并且没有嵌套项具有过多的初始值设定项。此外,可以省略结构的某些字段,并使编译器自动归零它们,即使结构不在数组的末尾。请注意,实现的处理效率各不相同;一些实现会将初始化记录分成小块,而另一些实现只会在代码中插入大量的零。例如,如果每个结构看起来像:

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
};
类型定义结构{ 字符名[8]; char more_stuff[1016]; }THINGIE; THINGIE my_数组={{“Fred”}、{“George”}、{“Mark”};
一些编译器将生成3K值的常量数据,而另一些编译器将生成三个相对较小的“const init”记录。

使用大括号的优势在于,它可以省略某些成员部分的初始化(然后隐式初始化为零)继续初始化以后的成员时。使用
{x',y',z'},
就是一个例子。编译器无法检查大括号是否只出现在“应该”出现的地方,因为它们在任何地方都有效。即使这是有效的C:
int x={0};
。您遗漏了“typedef”结构定义之前的关键字。在上面的代码中,THINGIE是一个变量,而不是一个类型。@R:True;如果您尝试在一个大括号中放置两个或多个对象,则会得到验证。我非常确定“int x={0,1};”是不合法的。+1用于说明人们对C的许多不理解的问题。只是为了确保我理解正确。由于所有未指定的字段都初始化为零,
={0}
本质上没有效果?它确实有效果。它专门将第一个元素初始化为零,然后隐式将其余元素初始化为零。如果省略了{0},如果在函数内部(堆栈上)声明它,则会得到随机垃圾。(注意,如果将其声明为全局并省略{{0},它也将被初始化为零,但原因不同。)
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
};
typedef struct { char name[8]; char more_stuff[1016]; } THINGIE; THINGIE my_array = {{"Fred"},{"George"},{"Mark"}};