2014-07-08 154 views
-1

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

#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 

我不明白为什么会这样。

+4

此代码为我编译。你确定这里的东西是你想要编译的吗? –

+0

这段代码也是为我编译的。 – Ralph

+0

检查出你的代码没有任何修改工作:http://ideone.com/VL9RJ0 – Jack

回答

1

我假设你的编译错误出现在注释行中,并且你从编译器那里得到这条消息,当他们不在评论中时。

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

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

现在它编译和运行输出是:

st.s1.a : 20 st.t1.d : 10 
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}}} 
1

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

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

st str = ST_ALLOC;