初始化多维数组:{0}与{{{0}}}

时间:2016-11-14 13:51:29

标签: c arrays initialization

在我正在分析的C代码中,有很多多维(struct)数组,它们用不同数量的大括号进行初始化,例如: {{0}}{{{0}}}

但是,用{0}替换这些也很有效。

使用一组或多组花括号({})出现之间是否存在(功能)差异?

3 个答案:

答案 0 :(得分:15)

不,没有功能差异。 C标准允许省略中间{}。特别是,{ 0 }形式是一个初始化程序,可用于所有数据类型。

答案 1 :(得分:8)

您有两个选择:{ 0 },适用于任何聚合或联合类型,零可初始化每个成员,或使用必须正确对应所有成员的正确表单。

答案 2 :(得分:4)

重申Jens已经说过的话,{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;)都需要对所涉及的类型有一些内部知识,并且存在不可移植的风险。