2016-09-05 28 views
3

考慮以下結構:初始化結構零,除了一個外地

typedef struct _sampleStruct{ 
    bool b; 
    int i; 
    double d; 
    int arr[10]; 
}sampleStruct; 

我想初始化結構,使得b被初始化爲true和領域的休息全球實例初始化爲0 。 此外,我想初始化採取地方,我宣佈了,即我想要做這樣的事情:

sampleStruct globalStruct = {0}; 

int someFunc() 
{ 
    //... 
    globalStruct.b = true; 
    //... 
} 

有沒有辦法做到這一點? 我想過做這樣的事情:

sampleStruct globalStruct = {.b = true, 0}; 

做它承諾其他所有領域都始終爲零?

+0

注意:以下劃線開頭的名稱是爲所有名稱空間的實現保留的。不要在應用程序代碼中使用它們! – Olaf

+4

@Olaf帶有一個前導下劃線的符號只保留在全局範圍內(因此對於任何正常的結構定義它都是不允許的)。在所有範圍內都保留具有雙(或多)下劃線的符號,或帶有下劃線後跟大寫字母的符號。 –

+0

@JoachimPileborg:我應該區分,謝謝澄清。無論如何,'typedef'通常在文件範圍內。所以這很可能適用於此。但是,是的,因爲OP沒有提供[mcve],所以**可以在塊範圍內。 – Olaf

回答

6

是否承諾所有其他字段始終爲零?

是的。未明確初始化的成員將作爲指定初始化程序的一部分初始化爲零。那裏你甚至不需要那個0。這:

sampleStruct globalStruct = {.b = true}; 

應該就足夠了。

+1

不完全。它們被設置爲'0'(整​​數),'0.0'(浮點數)或_null pointer_。除整數外,不一定意味着零位。這與指定的初始化者無關。由於'b'是第一個字段,所以初始化程序'{true}'將起到相同的作用。指定的初始化者更清晰。 – Olaf

+5

你在哪裏閱讀這些內容?我的答案只是說*零初始化*。 – usr

+0

還有什麼其他的含義用指針「零」? – Olaf

2

是,這是通過C11 6.7.9保證/ 21:

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

「Aggregate」是標準亂碼含義:數組或結構或聯合。與簡單的單值變量(「標量」)相反。

上面「初始化好像它有靜態存儲時間」意思是(6.7。9/10):

如果具有靜態或線程存儲持續時間的對象沒有初始化 明確,則:
- 如果它有指針類型,它被初始化爲一個 空指針;
- 如果它有算術類型,則它初始化爲 (正數或無符號)零;
- 如果它是一個聚合,每個成員 根據這些規則初始化(遞歸),並且任何填充是 初始化爲零位;
- 如果它是一個聯合,根據這些規則初始化第一個已命名成員 (遞歸),並且任何填充 初始化爲零位;

這適用於初始值設定項列表中所有形式的初始值設定項。指定的初始化器也不例外,也不是特例。