c - 为什么结构数组不需要大括号初始化?
问题描述
这段代码:
#include <stdio.h>
struct
{
int i;
const char* str;
} ar[] = {
1,"asd", //should be {1, "asd"},
2, "qwe", //should be {2, "qwe"},
3, "poi" //should be {3,"poi"}
};
int main()
{
printf("%s\n", ar[2].str);
}
工作得很好,即使数组的每个元素都ar
应该用大括号括起来(至少我希望如此)。为什么这可能?
解决方案
6.7.9 Initialization/20说明了如何初始化此类结构元素:
[..] 如果子聚合或包含联合的初始化程序以左大括号开头,则由该大括号及其匹配的右大括号包围的初始化程序初始化子聚合或包含联合的元素或成员。否则,仅从列表中获取足够多的初始化器来考虑子聚合的元素或成员或包含的联合的第一个成员;剩下的任何初始化器都将用于初始化当前子聚合或包含的联合所属的聚合的下一个元素或成员。
(强调我的)
所以它是有效的。因此
ar[] = {
1,"asd",
2, "qwe",
3, "poi"
};
相当于:
ar[] = {
{1,"asd"},
{2, "qwe"},
{3, "poi"}
};
并ar
包含 3 个元素。
推荐阅读
- java - 如何在 Java 命令行选项中将资源文件夹添加到类路径
- kotlin - h2.bindAddress 被忽略
- freertos - FreeRTOS - 硬故障分析 - 失败
- vba - 如何在 MS Project 2010 VBA 中判断用户是否删除了一个值?
- bootstrap-4 - 卡片标题 - 图标上的链接停止折叠
- swift - Swift 中的奇怪行为 switch-case 语句
- java - Flink 按字段 id 对记录进行分组的最佳方法
- java - 读取 XML 文件
- c# - 正则表达式拆分右括号,后跟“\ b”旁边的空格
- c# - Expression.Constant 在应用于 IQueryable 时丢弃现有的 WHERE 条件