如何用?初始化结构数组?

时间:2011-12-19 16:34:17

标签: c structure

struct SampleStruct {
   int a;
   int b;
   float c;
   double d;
   short e;       
};

对于这样的数组,我曾经如下初始化它:

struct SampleStruct sStruct = {0};

我想知道当我声明这个结构的数组时,我认为这是正确的

struct SampleStruct sStructs[3] = {{0},{0},{0}};

但是,下面也被编译器接受了

struct SampleStruct sStructs[3] = {0};

我想知道最好,最安全的方法和详细原因。

2 个答案:

答案 0 :(得分:4)

$ gcc --version
gcc (GCC) 4.6.1 20110819 (prerelease)

如果使用-Wall选项,我的gcc会给出关于第三个选项的警告:

try.c:11:9: warning: missing braces around initializer [-Wmissing-braces]
try.c:11:9: warning: (near initialization for ‘sStruct3[0]’) [-Wmissing-braces]

表示你应该为初始化写= {{0}},它将第一个结构的第一个字段设置为0,其余部分隐式设置为0。该程序在这个简单的情况下给出了正确的结果,但我认为你不应该依赖于这个并且需要正确地初始化。

答案 1 :(得分:1)

gcc-4.3.4在前两个声明中没有给出错误,而在第三个声明中给出错误。

struct SampleStruct sStruct1 = {0};有效,因为在这种情况下0是字段a的值。其余字段隐式初始化为零。

struct SampleStruct sStructs2[3] = {{0},{0},{0}};有效,因为你在这里做的是声明三个结构并将每个结构的字段'a'初始化为零。其余字段隐式初始化为零。

struct SampleStruct sStructs3[3] = {0};不起作用,因为在大括号内编译器期望看到对应于三个结构的东西,而数字零不是它。