c - 当描述符重叠时,C11 数组初始化的行为是什么?
问题描述
鉴于这种
int array[10] = {
[0] = 1, 1, 1, 1, 1, 1, 1, // 7 values
[5] = 9
};
gcc (6.3.1) 不会生成初始化重叠的错误或警告。
定义行为是什么?它应该有一个警告还是数组是按照指示符出现的顺序初始化的?
解决方案
没有警告。该数组按照指定符出现的顺序进行初始化,因此后面的指定会覆盖前面的指定。
在您的示例中,您首先为前七个值(索引 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 标准,因为它声明
“初始化应按初始化程序列表顺序进行,为特定子对象提供的每个初始化程序都将覆盖同一子对象的任何先前列出的初始化程序”
推荐阅读
- grammar - 使用 $/ 与在语法操作中使用任何其他变量并不完全相同
- c - 我无法使用 ADC 正确配置我的 STM32F411RE DMA
- python - selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:
- c++ - unordered_map 的自定义哈希问题
- jquery - Mapael Map 如何使用 jquery 创建动态 json
- flutter - 从 Firestore 读取数据
- python - 为什么 peewee 在这种多对多关系中失败了?peewee.IntegrityError: UNIQUE 约束在直通表上失败
- python - 如何从命令行 odoo 11 卸载/更新模块
- hibernate - SQLite 数据库在执行 JAR 时没有响应
- python - 为什么 lemmatizer 在某些单词中不起作用?