2010-10-07 88 views

回答

9

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

+0

只是为了确保我正确理解这一点。由于所有非指定字段都初始化为零,因此'= {{0}}'本质上没有影响? – 2010-10-08 00:31:53

+2

它确实有效果。它专门将第一个元素初始化为零,然后隐式地将其余元素初始化为零。如果你省略了{{0}},如果你在函数内部(栈上)声明它,你会得到随机垃圾。 (请注意,如果将此声明为全局并省略{{0}},则它也将初始化为零,但出于不同的原因。) – xscott 2010-10-08 03:47:38

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

如图所示?

基本上,你应该把每个复合类型 - 数组,结构等 - 放在它自己的大括号内。

考虑:

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 
}; 

任何省略的初始化将被视为零。

+0

使用大括号的优点是,它可以让您省略零件的初始化的一些成员(然后将隐含地初始化为零),同时继续初始化后面的成员。你使用'{'x','y','z'},'就是一个例子。 – 2010-10-07 16:52:10

0

需要注意的是,虽然内部大括号是可选的,但编译器会检查并确保只在他们应该出现的位置显示大括号,并且没有嵌套的项目具有太多的初始化程序。此外,即使结构不在数组的末尾,也可以省略结构的某些字段,并让编译器自动将它们归零。请注意,这些实现的处理效率各不相同;有些会将初始化记录分成小块,而另一些则会简单地在代码中插入大量的零。例如,如果每个结构看上去像:

 
typedef struct { 
    char name[8]; 
    char more_stuff[1016]; 
} THINGIE; 
THINGIE my_array = {{"Fred"},{"George"},{"Mark"}}; 

一些编译器会产生3K值得常量数据,而其他人会产生三个相对小'常量,初始化的记录。

+0

编译器无法检查开启花括号只出现在“应该”的位置,因为它们在任何地方都有效。即使这是有效的C:'int x = {0};'。 – 2010-10-07 16:53:08

+0

您在结构定义之前省略了“typedef”关键字。在你的代码中,THINGIE是一个变量,而不是一个类型。 – xscott 2010-10-08 06:10:24

+0

@R:True;如果您尝试将两个或更多东西放入大括号中,您可以在其中进行验证。我很确定“int x = {0,1};”不合法。 – supercat 2010-10-08 13:13:29