2010-07-30 72 views
13

在C99(而不是C++),有可能使用這個語法來初始化結構:未指定初始化程序命名的字段會發生什麼情況?

struct info 
{ 
    char name[8+1]; 
    int  sz; 
    int  typ; 
}; 

struct info arr[] = 
{ 
    [0] = { .sz = 20, .name = "abc" }, 
    [9] = { .sz = -1, .name = "" } 
}; 

發生了未指定的領域是什麼?

+2

我很確定他們是0初始化的。但是我也確定其他人會更快地找到C99規範的一部分。 ...我是對的! – torak 2010-07-30 18:45:03

回答

23

它們被歸零。從C99標準§ 6.7.8(初始化)/ 21,

如果在一個大括號內的列表更少初始化值多於字面用於元件或聚集體的成員,或在一個字符串中更少的字符初始化一個已知大小的數組,比數組中的元素,聚合的其餘部分應該隱式地初始化爲具有靜態存儲持續時間的對象。

+0

正是我想知道的,完整的標準報價。謝謝! – 2010-07-30 18:49:04

+3

@Matt喬伊納:有沒有任何疑問?噢,爲了完整性,請參閱§6.7.8(初始化)/ 10,它有效地聲明這樣的靜態存儲是NULL/0初始化的。 – torak 2010-07-30 18:52:55

+2

這個事實的一個有用的結果是'{0}'是一個通用的零初始化器,它可以用於任何聚集類型(實際上任何類型的IIRC,儘管一些編譯器可能會給出警告,如果它用於簡單類型)。 – 2010-07-30 23:30:02

相關問題