我们可以在数组内联声明中分配更少的数组内容吗?

时间:2016-01-19 18:57:48

标签: c arrays initialization language-lawyer

我有一个数组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),我在哪里可以看到这种行为。

2 个答案:

答案 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)   未明确初始化的所有子对象应隐式初始化为   具有静态存储持续时间的对象。