首页 > 解决方案 > 当描述符重叠时,C11 数组初始化的行为是什么?

问题描述

鉴于这种

int array[10] = {
[0] = 1, 1, 1, 1, 1, 1, 1, // 7 values
[5] = 9
};

gcc (6.3.1) 不会生成初始化重叠的错误或警告。

定义行为是什么?它应该有一个警告还是数组是按照指示符出现的顺序初始化的?

标签: carraysinitializationc11descriptor

解决方案


没有警告该数组按照指定符出现的顺序进行初始化,因此后面的指定会覆盖前面的指定。

在您的示例中,您首先为前七个值(索引 0 到 6)分配了 1,然后为第六个值(索引 5)分配了 9。

您的数组将包含值(从索引 0 到 9 的顺序)

  • 1, 1, 1, 1, 1, 1, 1, 0, 0, 0从第一个定义,[0] = 1, 1, 1, 1, 1, 1, 1,
  • 1, 1, 1, 1, 1, 9, 1, 0, 0, 0从第二个开始,[5] = 9

这也符合 C99 和 C11 标准,因为它声明

“初始化应按初始化程序列表顺序进行,为特定子对象提供的每个初始化程序都将覆盖同一子对象的任何先前列出的初始化程序”


推荐阅读