我有一个数组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),我在哪里可以看到这种行为。
答案 0 :(得分:1)
根据C标准(6.7.9初始化)
19初始化应在初始化程序列表顺序中进行,每个顺序 初始化程序为特定的子对象提供覆盖任何子对象 以前列出的同一子对象的初始值设定项; 151)全部 未初始化的子对象应初始化 隐式与具有静态存储持续时间的对象相同。
和
10如果未初始化具有自动存储持续时间的对象 显然,它的价值是不确定的。如果一个对象有静态 或线程存储持续时间未明确初始化,然后:
- 如果它有算术类型,则初始化为(正数或 unsigned)零;
来自C ++标准(8.5.1聚合)
7如果列表中的initializer-clause数量少于 聚合中的成员,然后每个成员未明确初始化 应从其支撑或等于初始化器初始化,或者如果有的话 没有大括号或大小正相合,来自空的初始化列表 (8.5.4)
和(8.5初始化者)
3定义了对象或类型T的引用的列表初始化 如下:
- 否则,如果初始化列表没有元素,则对象为 的值初始化强>
并进一步
8对T类型的对象进行值初始化意味着:
- 否则,该对象零初始化。
答案 1 :(得分:1)
是的,这应该是有效的。
引用C11
,章节§6.7.9,初始化
每个大括号括起的初始化列表都有一个关联的当前对象。什么时候没有 如果存在名称,则按照顺序初始化当前对象的子对象 到当前对象的类型:增加下标顺序的数组元素,[...]
然后,(强调我的)
初始化应在初始化器列表顺序中进行,每个初始化器提供给a 特定子对象覆盖同一子对象的任何先前列出的初始化程序; 151) 未明确初始化的所有子对象应隐式初始化为 具有静态存储持续时间的对象。