为什么结构数组不需要大括号初始化?

mil*_*bos 5 c curly-braces list-initialization

这段代码:

#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);
}
Run Code Online (Sandbox Code Playgroud)

工作得很好,即使数组的每个元素都ar应该用大括号括起来(至少我希望如此)。为什么这是可能的?

P.P*_*.P. 4

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

[..] 如果子聚合或包含的联合的初始值设定项以左大括号开头,则该大括号及其匹配的右大括号括起来的初始值设定项将初始化子聚合或包含的联合的元素或成员。否则,仅考虑列表中足够的初始值设定项来考虑子聚合的元素或成员或所包含联合的第一个成员;剩余的初始化程序将用于初始化当前子聚合或包含的联合所属的聚合的下一个元素或成员。

强调我的

所以它是有效的。因此

ar[] = {
    1,"asd",
    2, "qwe",
    3, "poi"
};
Run Code Online (Sandbox Code Playgroud)

相当于:

 ar[] = {
    {1,"asd"},
    {2, "qwe"},
    {3, "poi"}
};
Run Code Online (Sandbox Code Playgroud)

ar包含 3 个元素。