2014-07-08 152 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;