10 c arrays initialization designated-initializer initializer-list
在这里,我已经初始化了这样的数组:
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
a[7] = 4
a[8] = 8
a[9] = 9
Run Code Online (Sandbox Code Playgroud)
在这里,我选择了数组索引7作为a a[7] = 4,然后添加了一些元素.然后打印索引的数组元素7,8并9正确打印.
那么,索引的输出是否正确8而9没有明确定义呢?为什么序列不是从索引开始的3?
Sou*_*osh 11
为什么序列不从索引3开始?
因为,这不是它的工作方式!
引用C11,章节§6.7.9 指定初始化器 (强调我的)
每个大括号括起的初始化列表都有一个关联的当前对象.当没有指定时,根据当前对象的类型按顺序初始化当前对象的子对象:增加下标顺序的数组元素,声明顺序中的结构成员,以及union的第一个命名成员.148).相反,指定使得以下初始化器开始由指示符描述的子对象的初始化.然后,初始化按顺序继续向前,从指定者描述的下一个子对象开始.149)
因此,在您的情况下,在指示符之后[7],括号括起来的列表中剩余的两个元素将用于初始化下一个子对象,索引8和数组元素9.
只是添加一些更相关的信息,
如果指定者有表格
Run Code Online (Sandbox Code Playgroud)[ constant-expression ]那么当前对象(下面定义)应该有数组类型,表达式应该是一个整数常量表达式.[...]
索引8和9的输出是否正确而没有明确定义它?
是的,这是正确的.编译器将在索引之后初始化数组元素7.
初始化器将前三个元素初始化为1,2和3.索引处的元素7将具有该值4.索引后两个元件7将具有值8和9分别.
为什么序列不从索引3开始?
指定的初始化程序[7]告诉编译器在索引之后继续初始化数组元素7.