2010-01-29 75 views
2

我有一組結構的,定義如下:初始化嵌套結構沒有定義的所有字段

typedef struct 
{ 
    int index; 
    int array[10]; 
} 
Item; 

typedef struct 
{ 
    Item A; 
    Item B; 
    Item C; 
} 
Collection; 

我要聲明Collection類型的變量如下:

Collection collection = 
{ 
    { 1, 0 }, /* item A */ 
    { 2, 0 }, /* item B */ 
    { 3, 0 } /* item C */ 
}; 

請問這個將三個index變量設置爲1,2和3,同時將所有三個array[]變量初始化爲零?

它似乎在我的編譯器上工作,但我想知道這是否是標準行爲。

回答

4

這是符合標準的。請參閱 - 6.7.8初始化一節。此外,您可以在符合C99的編譯器中使用指定的初始化程序。

+0

這很酷。直到今天,我從未聽說過指定的初始化程序! –

7

應該有圍繞零額外的支撐,使其有效的數組初始化:

Collection collection = 
{ 
    { 1, {0} }, /* item A */ 
    { 2, {0} }, /* item B */ 
    { 3, {0} } /* item C */ 
}; 

除此之外它將正確初始化結構。

inizializer也沒有額外的大括號有效,但你會得到編譯器的警告,並且它更容易混淆,如果初始化子集合明確。有關詳細信息,請參閱C99標準中6.7.8節中直接指出的內容,特別是6.7.8(20)和6.7.8(29)中的示例。

+0

絕對有效的觀察,儘管它很難回答這個問題。 +1無論如何 – qrdl

+1

+1。我認爲即使沒有大括號,我們也會有所謂的「不完全但始終括號內的初始化」。 – dirkgently

+0

@qrdl:我把這個問題看成是「這樣做是正確的」,但你是對的,我添加了另一行清楚地表明它會正確地初始化結構。 – sth