2010-10-25 62 views
1

我有一個數組作爲成員的結構,並試圖使用箭頭語法來設置該數組。我有什麼:C:通過指針設置結構的數組成員

typedef float Foo[3]; 
typedef struct { 
    Foo foo; 
} Bar; 

Bar* f() { 
    Bar* bar = malloc(sizeof(Bar)); 
    bar->foo = {1.0, 1.0, 1.0}; 

    return bar; 
} 

GCC說:

error: expected expression before '{' token 

上線bar->foo = {1.0, 1.0, 1.0};

我不知所措,爲什麼這是行不通的。提前致謝。

+2

請不要使用抽象名稱「typedef」原始類型,就像您正在嘗試的那樣。它只是令人頭痛的道路。 – 2010-10-25 00:21:54

+0

@Tim Cooper:我同意,不幸的是這個項目超出了我的控制範圍。 – breadjesus 2010-10-25 01:52:23

回答

5

C99允許它通過複合文字:

Bar* f() 
{ 
    Bar* bar = malloc(sizeof(Bar)); 

    if (bar) 
     *bar = (Bar){{1.0, 1.0, 1.0}}; 

    return bar; 
} 

的「外」花括號封裝結構作爲一個整體(如果有結構的其他成員,你會列出他們在外花括號),以及「內部」捲曲是針對陣列的。

+0

這是否意味着你也可以執行'bar-> foo =(float [3]){1.0,1.0,1.0};'? – 2010-10-25 00:32:38

+2

不,因爲'='沒有爲數組類型定義,但它是爲結構類型(即使是包含數組的結構)定義的。有關分配的更多信息,請參閱第6.5.16.1節。 – dreamlax 2010-10-25 00:36:00

1

因爲C不能通過賦值來複制數組。你可以永遠使用{1.0, 1.0, 1.0}語法的唯一地方是在一個變量的初始化:

float foo[3] = {1.0, 1.0, 1.0}; 

這只是不是東西,語言支持。這可能是因爲這會使運營商無限期地花費很長時間來執行復制 - 這是一個哲學問題。

+0

對於結構體,'='是很好定義的。甚至包含數組的結構都是可分配的。 – dreamlax 2010-10-25 00:29:33

+0

確實如此,賦值對結構起作用。對於包含數組的結構而言,它是該語言的一個晦澀的角落。有些東西要與設計師合作。 – 2010-10-25 00:30:23

0

這不是受支持的語法。只有在創建數組時才能對其進行初始化 - 您無法分配給創建的數組。

+0

除非它是struct的成員:) – dreamlax 2010-10-25 02:17:11

0

嘗試

float bar[3] = {1.0, 2.0, 3.0}; 
float foo[3]; 
foo = {1.0, 2.0, 3.0}; 

即初始化和分配之間的差的一個例子,存在用於在C數組沒有賦值運算符。

不過請注意,您可以

Bar baz, quix 
/* quix get setup some how... */ 
bar = quix; 

因爲對struct秒的賦值操作,這是多麼dreamlax's answer作品。