2016-11-14 172 views
23

在C代碼我分析,有很多多維(結構)陣列的這些具有不同數量的大括號例如初始化{{0}}{{{0}}}初始化多維數組:{0}與{{{0}}}

然而,{0}替換這些也完美的作品。

是否有使用大括號({})出現的一個或多個集合之間的(功能性)差?

+4

[初始化與一個值整個2D陣列(http://stackoverflow.com/questions/15520880/initializing-entire-2d-array-with-one-value)應該回答爲什麼'{0}'作品。 – Lundin

回答

13

不,沒有功能差異。 C標準允許省略中間{}。特別是{ 0 }是一個可用於所有數據類型的初始化程序。

8

您有兩種選擇:{ 0 },適用於任何聚合或聯合類型,零初始化每個成員,或者使用必須正確對應所有成員的正確形式。

+4

編號'{0}'即使對於標量類型也適用。 '{0}'和'{{{0}}}'沒有區別。 –

+1

你說過「適用於任何集合或工會類型」。這不意味着如此嗎? –

+3

@ P.P。 '{0}'對標量類型有效,但我從來沒有說過它不會。 – 2501

3

只是爲了重申延斯已經表示,{0}適用於任何類型的。它是C中的「通用零初始值設定程序」。 參見C11草案,6.7.9 Initialization

所以,初始化3D陣列或者{0}{{{0}}}都可以使用。就個人而言,我會使用{0},因爲它更容易輸入和閱讀,適用於各種類型。這意味着,以下是所有有效的初始化:

int main(void) 
{ 
    int x = {0,}; 
    int *p = {0,}; 
    int *q = {0}; 
    int arr[3][3][3][3] = {0}; 
} 

更重要的是,如果你碰巧有一些未知/不透明的類型,例如從第三方庫,然後初始化它們是唯一可移植的方法 使用{0}。任何其他的調零方法(例如使用memset()或直接some_type_t state = 0;)都需要一些關於所涉及類型的內部知識,並且風險是不可移植的。

+3

如果您從另一個庫中獲得一個不透明類型,您不應該首先干涉它的內部部分,而是讓該庫初始化它。 – Lundin