2015-12-18 64 views
1

如果我没有定义初始化所有值的数组,像这样:当你引用一个未定义的数组元素时,会发生什么?

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

如果,例如,我引用x[9]会发生什么?它提取什么价值?是否0,因为我没有定义这个值?

+0

标题答案:当代码引用数组的** undefined **元素时,它是未定义的行为。帖子正文答案:OTOH,OP示例是对**定义**数组元素的引用,并且'x [9]'是0. – chux

回答

2

如果例如我参考x [9]会发生什么?

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

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

C11草案,§6.7.9,初始化

如果在一个大括号内的列表更少初始化值多于 是元件或聚集体的成员,或在 串更少的字符文字用于初始化一个已知大小的数组,其中 是数组中的元素,聚合的其余部分应为 ,隐含地初始化为具有静态存储持续时间的对象。

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

同样,如果您有:

int i; 
int j; 

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

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

1

初始化程序列表将按其索引的增加顺序初始化数组元素。如果初始值设定项列表的大小小于数组大小,则其余元素将被初始化为0,

+0

在java中,会抛出'arrayindexoutofbounds'异常!! ...是否有在c中有任何类似的异常 –

+2

C中没有例外。异常是高级语言的结构。 (Java,C++等) – ForeverStudent

+1

@IIIIIIIIIIIIIIIIIIIIIIII ha指出C中没有异常处理程序,不像Java。 – haccks

相关问题