如何初始化结构数组?

问题描述:

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

我想要知道最好,最安全的方式和详细的理由。

+1

请告诉我们你得到了什么错误,以及你使用的是什么编译器。 “它给我一个错误”就像泥巴一样清晰。 – 2011-12-19 17:14:00

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

如果使用-Wall选项,我的海湾合作委员会给了我关于第三个警告:

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。该程序在这个简单的例子中给出了正确的结果,但我认为你不应该依赖这个并需要正确地初始化事物。

gcc-4.3.4不会给前两个声明带来错误,而会给第三个声明带来错误。

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

struct SampleStruct sStructs2[3] = {{0},{0},{0}};的工作原理是因为你在这里做的是声明三个结构并初始化它们中每一个的字段'a'为零。其余的字段被隐式地初始化为零。

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

+0

有趣的是,我现在去ideone.com再次尝试这个,以添加更多关于我得到的错误的信息,并且它都编译时没有任何错误。我猜想ideone的警告级别已经改变,但我无法控制它。 – 2011-12-20 14:50:21