【问题标题】:Can we assign less array contents at array inline declaration?我们可以在数组内联声明中分配更少的数组内容吗?
【发布时间】:2016-01-19 18:57:48
【问题描述】:

我有一个数组A,它封装了M 类型为B 的数组。每个这样的B 数组都有3-components。 但是,我需要将我的条目填充到4 components。一种方法是修改我的值,使其具有第 4 个零分量:

uint16_t A[M][4] = {{a0,a1,a2,0}, {a3,a4,a5,0}, ... , {aM-1,aM,aM+1,0}};

但是,我意识到我可以如下声明 A 并且 clang 没有抱怨:

uint16_t A[M][4] = {{a0,a1,a2}, {a3,a4,a5}, ... , {aM-1,aM,aM+1}};

这合法吗?编译器会扩展 A 的条目以包含第 4 个组件吗?您能否指出 C 标准 (PEP) 我在哪里可以看到这种行为的解释。

【问题讨论】:

    标签: c arrays initialization language-lawyer


    【解决方案1】:

    是的,这应该是有效的。

    引用 C11,第 §6.7.9 章,初始化

    每个用大括号括起来的初始化器列表都有一个关联的当前对象。没有时 指定存在,当前对象的子对象按顺序初始化 到当前对象的类型:数组元素按递增下标顺序,[...]

    然后,(强调我的

    初始化应按初始化程序列表顺序进行,每个初始化程序提供一个 特定子对象覆盖同一子对象的任何先前列出的初始化程序;151)所有未显式初始化的子对象都应隐式初始化,与 具有静态存储持续时间的对象。

    【讨论】:

    • 谢谢,大括号括起来的描述和以下语句的组合向我解释了这一点。
    【解决方案2】:

    根据 C 标准(6.7.9 初始化)

    19 初始化应按初始化列表顺序进行,每个 为覆盖任何特定子对象提供的初始化程序 先前列出的同一子对象的初始化程序;151) 全部 未显式初始化的子对象应被初始化 隐含地与具有静态存储持续时间的对象相同。

    10 如果具有自动存储时长的对象未初始化 明确地说,它的值是不确定的。如果一个物体有静电 或者线程存储时长没有显式初始化,则:

    ——如果它有算术类型,它被初始化为(正数或 无符号);

    并且来自 C++ 标准(8.5.1 聚合)

    7 如果列表中的初始化子句少于 聚合中的成员,然后每个成员未显式初始化 应从其大括号或相等初始化器初始化,或者,如果有 不是大括号或等式初始化器,来自一个空的初始化器列表 (8.5.4)

    And(8.5 初始化器)

    3 定义了类型 T 的对象或引用的列表初始化 如下:

    ——否则,如果初始化列表没有元素,则对象为 值初始化

    还有更多

    8 对 T 类型的对象进行值初始化意味着:

    ——否则,对象被零初始化

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 2013-12-19
      • 2022-01-09
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2016-02-01
      相关资源
      最近更新 更多