当您引用数组的未定义元素时,C中会发生什么?

时间:2015-12-18 18:05:13

标签: c arrays variables memory

如果我在没有初始化所有值的情况下定义数组,如下所示:

int x[10] = {1, 3, 5, 2, 9, 8, 4, 7, 6};

例如,如果我引用x[9]会怎样?它取得了什么价值?它是0,因为我没有定义该值吗?

2 个答案:

答案 0 :(得分:2)

  

例如,如果我引用x [9]?

会发生什么

它将为零(正如您所发现的那样)。初始化数组的一个或多个元素时,数组的其余元素将隐式初始化为零。

这不是因为您没有“定义”任何值,而是C标准规定的行为。

C11草案,§6.7.9,初始化

  

如果括号括起的列表中的初始值设定项少于此值   是聚合的元素或成员,或者是一个或多个字符   string literal用于初始化已知大小的数组   是数组中的元素,聚合的其余部分应为   隐式初始化与具有静态存储的对象相同   持续时间。

这意味着x [9]将初始化为0,因为您已明确初始化索引范围0-8。

同样,如果你有:

int i;
int j;

int *ptrs[10] = {&i, &j}; // an array of 10 pointers

其余的指针,索引范围从2-9将被隐式初始化为空指针。

答案 1 :(得分:1)

初始化列表将按索引的递增顺序初始化数组元素。如果初始化程序列表的大小小于数组大小的大小,那么其余元素将使用0进行初始化,