初始化结构数组

时间:2014-07-08 14:51:27

标签: c

我尝试了一个示例程序来初始化一个结构数组,如下所示,并且出现错误。但是当我使用单个变量进行初始化时,我没有得到任何变量。

#include<stdio.h>

typedef struct s_{
        int a;
        int b;
}s;

typedef struct t_{
        int c;
        int d;
}t;

typedef struct st_{
        s s1;
        t t1;
}st;

#define ST_ALLOC {{20,20},{10,10}}

int main(){
 st str[2] = ST_ALLOC;
 //str[0] = ST_ALLOC;
 //str[1] = ST_ALLOC;

 printf("\n st.s1.a : %d st.t1.d : %d \n",str[1].s1.a,str[1].t1.d);
 return 0;
}

错误:

a.c: In function ‘main’:
a.c:22: error: expected expression before ‘{’ token
a.c:23: error: expected expression before ‘{’ token

我无法理解为什么会这样。

3 个答案:

答案 0 :(得分:1)

我假设您的编译错误在注释行中,并且当它们不在注释中时您从编译器获得此消息。

我可以看到你试图实例化一个长度为2的数组,它的每个单元格都将包含你在前一个宏中定义的st结构。为此,您可以简单地执行:

st str[2] = {ST_ALLOC,ST_ALLOC};

现在它编译并且运行输出为:

st.s1.a : 20 st.t1.d : 10

答案 1 :(得分:1)

我只收到一些编译器警告

test2.c: In function ‘main’:
test2.c:25:2: warning: missing braces around initializer [-Wmissing-braces]
test2.c:25:2: warning: (near initialization for ‘str[0].s1’) [-Wmissing-braces]

您收到警告,因为您只初始化您声明的2个结构中的1个。

因为您只打印str[1],我想您要将str[0]初始化为0,因此您必须将定义更改为:

#define ST_ALLOC {{{0,0},{0,0}},{{20,20},{10,10}}}

答案 2 :(得分:1)

花括号表示法用于初始化数组,不能在定义行之后使用。这就是为什么编译错误存在于注释掉的行中的原因。

正如米奇指出的那样,这个问题因误导性的初始化而有点混乱。如果您想在两个st的数组中初始化两个st,则应使用{ST_ALLOC, ST_ALLOC}。如果它只是一个st,则会初始化所有元素:

st str = ST_ALLOC;