在我正在分析的C代码中,有很多多维(struct)数组,它们用不同数量的大括号进行初始化,例如: {{0}}
或{{{0}}}
。
但是,用{0}
替换这些也很有效。
使用一组或多组花括号({}
)出现之间是否存在(功能)差异?
答案 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;
)都需要对所涉及的类型有一些内部知识,并且存在不可移植的风险。