2016-11-14 130 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