首页 > 解决方案 > 为什么结构数组不需要大括号初始化?

问题描述

这段代码:

#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应该用大括号括起来(至少我希望如此)。为什么这可能?

标签: ccurly-braceslist-initialization

解决方案


6.7.9 Initialization/20说明了如何初始化此类结构元素:

[..] 如果子聚合或包含联合的初始化程序以左大括号开头,则由该大括号及其匹配的右大括号包围的初始化程序初始化子聚合或包含联合的元素或成员。否则,仅从列表中获取足够多的初始化器来考虑子聚合的元素或成员或包含的联合的第一个成员;剩下的任何初始化器都将用于初始化当前子聚合或包含的联合所属的聚合的下一个元素或成员。

强调我的

所以它是有效的。因此

ar[] = {
    1,"asd",
    2, "qwe",
    3, "poi"
};

相当于:

 ar[] = {
    {1,"asd"},
    {2, "qwe"},
    {3, "poi"}
};

ar包含 3 个元素。


推荐阅读