2014-10-30 90 views
5
here is the code 

struct point_tag { 
     int x; 
     int y; 
}; 

typedef struct point_tag Point; 

int main(void) 
{ 
     Point pt[] = { {10,20}, {30, 40}, {50,60}}; 
     pt[0] = {100,200}; 
} 

當我做pt[0] = {100, 200},編譯器不斷抱怨爲什麼不編譯這個結構體分配數組?

error:expected expression before '{' token

我真的不明白,雖然。 {token token operator(=)之前的表達式不是嗎?

我不明白爲什麼這項任務會成爲一個問題。地址pt處的值指的是一個Point數組。我只是將第0個點設置爲這個新點,我知道以{100,200}這樣的格式分配一個結構是合法的,該數組內的元素只是字段。

回答

6

對於分配,強制轉換的值輸入點,使之成爲compound literal

pt[0] = (Point){100,200}; 

Live code使用gcc

這相當於

{ 
    Point temp = {100,200}; 
    pt[0] = temp; 
} 

P.S.複合文字在舊的嚴格C89兼容編譯器中不可用。在GCC中,C89作爲擴展是可用的,而C99複合文本是一個核心特徵。

+0

您是否有理由不必爲{10,20},{30,40}和{50,60}執行此操作?那讓我trips。不安。從技術上講,您仍然將這些值分配給數組中這些索引的值 – committedandroider 2014-10-30 06:17:50

+2

因爲上述構造僅可用於初始化。在'pt [0] =(Point){100,200};'中,你正在創建一個臨時的'Point'並將它分配給'pt [0]'。你必須告訴編譯器,「{100,200}」是一個「Point」還是「int [2]」或別的東西。 – 2014-10-30 06:19:52

+0

但不能這是類似的邏輯,因爲你也創建一個臨時點{10,20},並將其存儲爲數組中的第一個索引的值? – committedandroider 2014-10-30 06:22:11