指定符后的元素是否以严格增加的方式初始化元素?

时间:2017-09-14 16:54:05

标签: c arrays initialization initializer-list designated-initializer

在这里,我已经初始化了这样的数组:

#include <stdio.h>

int main() 
{
    int a[10] = {1, 2, 3, [7] = 4, 8, 9};

    printf("a[7] = %d\na[8] = %d\na[9] = %d\n", a[7], a[8], a[9]);

    return 0;
}

输出

a[7] = 4
a[8] = 8
a[9] = 9

在这里,我选择了数组索引7作为a[7] = 4,然后添加了一些元素。然后打印索引789的数组元素并正确打印。

那么,如果没有明确定义,它是否正确输出索引89? 为什么序列不是从索引3开始的?

2 个答案:

答案 0 :(得分:11)

  

为什么序列不从索引3开始?

因为,这不是它的工作原理!!

引用C11指定初始值设定项强调我的)的第6.7.9章

  

每个大括号括起的初始化列表都有一个关联的当前对象。什么时候没有   如果存在名称,则按照顺序初始化当前对象的子对象   到当前对象的类型:数组元素增加下标顺序,结构   声明顺序中的成员,以及union的第一个命名成员。 148)。相比之下,a   指定使以下初始化程序开始初始化子对象   由指定人员描述。 初始化然后按顺序继续向前,开始   在指定者描述之后的下一个子对象。 149)

因此,在您的情况下,在指示符[7]之后,括号括起列表中的其余两个元素将用于初始化下一个子对象,索引8和{{中的数组元素1}}。

只是添加更多相关信息,

  

如果指定人员的表格为

9
     

那么当前对象(下面定义)应该有数组类型,表达式应该是   整数常量表达式。 [...]

答案 1 :(得分:6)

  

是否正确定义了索引8和9的输出是否正确?

是的,这是正确的。编译器将在索引7之后初始化数组元素 初始值设定项将前三个元素初始化为123。索引7处的元素将具有值4。索引7之后的两个元素将分别具有值89

  

为什么序列不从索引3开始?

指定初始值设定项[7]告诉编译器在索引7之后继续初始化数组元素。