2012-08-02 52 views
12

在C中,您可以部分初始化結構體或數組,結果是初始化程序中未提及的成員/元素將被初始化。 (C99第6.7.8.19節)。例如: -字符串文字是否計算爲部分初始化器並進行零初始化?

int a[4] = {1, 2}; 
// a[0] == 1 
// a[1] == 2 
// a[2] == 0 
// a[3] == 0 

也可初始化「字符類型的數組的」與字符串文字(C99節6.7.8.14),以及「連續的字符...初始化數組的元素」。例如: -

char b[4] = "abc"; 
// b[0] == 'a' 
// b[1] == 'b' 
// b[2] == 'c' 
// b[3] == '\0' 

所有非常簡單。但是如果你明確地給出數組的長度會發生什麼,但是使用太短的文字來填充數組呢?剩餘的字符是否被初始化,還是有未定義的值?

char c[4] = "a"; 
// c[0] == 'a' 
// c[1] == '\0' 
// c[2] == ? 
// c[3] == ? 

把它當作一個部分初始化將使意義,它將使char c[4] = "a"完全一樣char c[4] = {'a'},並且它必須讓你簡明char d[N] = ""零初始化整個字符數組的有用的副作用,但我不清楚這是規格要求。

+2

Woot。我在SO上發現了一個有意義的問題。丹,你做了我的一天。 – 2012-08-02 15:39:52

回答

11
char c[4] = "a"; 

該陣列的所有其餘元素將被設置爲0。也就是說,不僅c[1]而且還有c[2]c[3]

請注意,這不取決於c的存儲時間,即使c具有自動存儲持續時間,其餘元素將被設置爲0

從C標準(重點煤礦):

(C99,6.7.8p21)「如果有在大括號內的列表更少初始化值多於一個聚合的元件或部件,或在用於初始化已知尺寸比有所述陣列中元件的陣列字面字符串更少的字符,所述聚集體的其餘部分應爲具有靜態存儲持續時間的對象被初始化隱含相同的。

+0

啊哈,那裏。這是我錯過的澄清。 – 2012-08-02 15:34:06

5

從C99標準(如已經由ouah說明):

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

和:

如果具有自動存儲持續時間的對象沒有被明確初始化, 它的值是不確定的。如果具有靜態存儲持續時間的對象是 沒有明確進行初始化,則:

  • 如果它有指針類型,它被初始化爲空指針;
  • 如果它有算術類型,它被初始化爲(正或無符號)零;
  • 如果它是一個聚合,每個成員根據這些規則初始化(遞歸);
  • 如果它是一個聯合,則根據這些 規則初始化(遞歸)第一個命名成員。

而且char是算術式,所以陣列的其餘元件將被初始化到零。

3

絕對無處不在的C語言它遵循全部或全部的方法進行初始化。如果您只是部分初始化一個聚合,則該聚合的其餘部分將被初始化爲零。

可以這麼說,這是過度的,並不是最佳的字符串,但這就是它如何在C中工作。