初始化多维数组:{0}与{{{0}}}
在C代码我分析,有很多多维(结构)阵列的这些具有不同数量的大括号例如初始化{{0}}
或{{{0}}}
。初始化多维数组:{0}与{{{0}}}
然而,{0}
替换这些也完美的作品。
是否有使用大括号({}
)出现的一个或多个集合之间的(功能性)差?
不,没有功能差异。 C标准允许省略中间{}
。特别是{ 0 }
是一个可用于所有数据类型的初始化程序。
您有两种选择:{ 0 }
,适用于任何聚合或联合类型,零初始化每个成员,或者使用必须正确对应所有成员的正确形式。
编号'{0}'即使对于标量类型也适用。 '{0}'和'{{{0}}}'没有区别。 –
你说过“适用于任何集合或工会类型”。这不意味着如此吗? –
@ P.P。 '{0}'对标量类型有效,但我从来没有说过它不会。 – 2501
只是为了重申延斯已经表示,{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;
)都需要一些关于所涉及类型的内部知识,并且风险是不可移植的。
如果您从另一个库中获得一个不透明类型,您不应该首先干涉它的内部部分,而是让该库初始化它。 – Lundin
[初始化与一个值整个2D阵列(http://stackoverflow.com/questions/15520880/initializing-entire-2d-array-with-one-value)应该回答为什么'{0}'作品。 – Lundin