如果我没有定义初始化所有值的数组,像这样:当你引用一个未定义的数组元素时,会发生什么?
int x[10] = {1, 3, 5, 2, 9, 8, 4, 7, 6};
如果,例如,我引用x[9]
会发生什么?它提取什么价值?是否0
,因为我没有定义这个值?
如果我没有定义初始化所有值的数组,像这样:当你引用一个未定义的数组元素时,会发生什么?
int x[10] = {1, 3, 5, 2, 9, 8, 4, 7, 6};
如果,例如,我引用x[9]
会发生什么?它提取什么价值?是否0
,因为我没有定义这个值?
如果例如我参考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指数范围将被隐式初始化为空指针。
初始化程序列表将按其索引的增加顺序初始化数组元素。如果初始值设定项列表的大小小于数组大小,则其余元素将被初始化为0
,
在java中,会抛出'arrayindexoutofbounds'异常!! ...是否有在c中有任何类似的异常 –
C中没有例外。异常是高级语言的结构。 (Java,C++等) – ForeverStudent
@IIIIIIIIIIIIIIIIIIIIIIII ha指出C中没有异常处理程序,不像Java。 – haccks
标题答案:当代码引用数组的** undefined **元素时,它是未定义的行为。帖子正文答案:OTOH,OP示例是对**定义**数组元素的引用,并且'x [9]'是0. – chux