【问题标题】:Initializing a multidimensional array: {0} versus {{{0}}}初始化多维数组:{0} 与 {{{0}}}
【发布时间】:2016-11-14 13:51:28
【问题描述】:

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

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

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

【问题讨论】:

标签: c arrays initialization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 没有。 {0} 甚至适用于标量类型。 {0}{{{0}}} 没有区别。
    • 您说“适用于任何聚合或联合类型”。不就是这样吗?
    • @P.P. {0} 确实适用于标量类型,但我从未说过它不适用。
    • {0} 是适用于 C 中每种类型的“通用初始化程序”。为什么将 {{0}} 作为 int 的初始化程序? OP 的问题是关于 {0} 是否可以作为多维数组的初始值设定项。答案是:两者都可以。
    • @P.P.那么你应该提到这一点。您的第一条评论中的第二句话说 {0} 和 {{{0}}} 之间没有区别,但这仅适用于 OP 未指定的恰好 3 维的数组。
    【解决方案3】:

    重申 Jens 已经说过的话,{0} 适用于任何类型。它是 C 中的“通用零初始化器”。 请参阅 C11 草案,6.7.9 Initialization

    因此,可以使用 {0}{{{0}}} 来初始化 3D 数组。我个人会使用{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;)都需要对所涉及的类型有一些内部知识,并且存在不可移植的风险。

    【讨论】:

    • 如果你有来自另一个库的不透明类型,你首先不应该干预它的内部结构,而是让那个库初始化它。
    • 我点击了,因为您的回答为帖子添加了有用的内容。但我想指出一个关于你的断言的小问题。尽管我同意标准对符号 { 0 } 的使用描述支持将它们用作通用零初始化器的想法,但您提供的链接中不存在您帖子中引用的短语.
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2022-12-15
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多