10

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

#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 a[7] = 4,然后添加了一些元素。然后打印 index 的数组元素789正确打印。

那么,它是正确的索引输出8并且9没有明确定义吗?为什么序列不从索引开始3

4

2 回答 2

11

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

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

引用C11,第 6.7.9 章指定初始化程序强调我的)

每个大括号括起来的初始值设定项列表都有一个关联的当前对象。当没有指定时,当前对象的子对象根据当前对象的类型按顺序初始化:数组元素按递增下标顺序,结构成员按声明顺序,以及联合的第一个命名成员。148)。相反,指定会导致以下初始化程序开始初始化指定符所描述的子对象。然后初始化按顺序继续向前,从指示符描述的子对象之后的下一个子对象开始。149)

因此,在您的情况下,在指示符之后[7],大括号括起来的列表中的剩余两个元素将用于初始化下一个子对象,即 index8和中的数组元素9

只是为了添加更多相关信息,

如果指定人具有以下形式

[ constant-expression ]

那么当前对象(定义如下)应具有数组类型,并且表达式应为整数常量表达式。[...]

于 2017-09-14T16:58:51.677 回答
6

在没有明确定义的情况下,它是否正确输出了索引 8 和 9?

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

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

指定初始化器[7]告诉编译器在 index 之后继续初始化数组元素7

于 2017-09-14T16:59:27.713 回答