我尝试了一个示例程序来初始化一个结构数组,如下所示,并且出现错误。但是当我使用单个变量进行初始化时,我没有得到任何变量。
#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
我无法理解为什么会这样。
答案 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;