在这里,我已经初始化了这样的数组:
#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
,然后添加了一些元素。然后打印索引7
,8
和9
的数组元素并正确打印。
那么,如果没有明确定义,它是否正确输出索引8
和9
?
为什么序列不是从索引3
开始的?
答案 0 :(得分:11)
为什么序列不从索引3开始?
因为,这不是它的工作原理!!
引用C11
,指定初始值设定项(强调我的)的第6.7.9章
每个大括号括起的初始化列表都有一个关联的当前对象。什么时候没有 如果存在名称,则按照顺序初始化当前对象的子对象 到当前对象的类型:数组元素增加下标顺序,结构 声明顺序中的成员,以及union的第一个命名成员。 148)。相比之下,a 指定使以下初始化程序开始初始化子对象 由指定人员描述。 初始化然后按顺序继续向前,开始 在指定者描述之后的下一个子对象。 149)
因此,在您的情况下,在指示符[7]
之后,括号括起列表中的其余两个元素将用于初始化下一个子对象,索引8
和{{中的数组元素1}}。
只是添加更多相关信息,
如果指定人员的表格为
9
那么当前对象(下面定义)应该有数组类型,表达式应该是 整数常量表达式。 [...]
答案 1 :(得分:6)
是否正确定义了索引8和9的输出是否正确?
是的,这是正确的。编译器将在索引7
之后初始化数组元素
初始值设定项将前三个元素初始化为1
,2
和3
。索引7
处的元素将具有值4
。索引7
之后的两个元素将分别具有值8
和9
。
为什么序列不从索引3开始?
指定初始值设定项[7]
告诉编译器在索引7
之后继续初始化数组元素。