我有两个数组,我必须得到特定指数的值。在做这件事的时候,我觉得很奇怪。当我打印出arr1的索引-1处的值时,我得到0并且索引8也发生了同样的事情。我得出结论,数组范围之外的inidces返回为0.现在我的问题。当我用arr2做同样的事情时,我得到29作为索引-1的值。
我做错了什么?
int arr1[] = {33, 12, 75, 85, 62, 14, 100, 29};
printf("Nummer -1: %d\n",arr1[-1]); //outputs 0
printf("Nummer 8: %d\n",arr1[8]; //outputs 0
int arr2[] = {85, 15, 84, 96, 4, 45, 55, 12, 25, 68};
printf("Nummer -1: %d\n",arr2[-1]); //outputs 29
注意:我在Linux Mint上使用代码:Blocks和gcc编译器
答案 0 :(得分:4)
我得出结论,数组范围之外的索引返回为0。
这是一个错误的结论:访问数组范围之外的索引会产生未定义的行为。访问也可能产生任意值,但它也可能导致程序崩溃:一旦调用了未定义的行为,程序就处于无效状态。
当我对
arr2
做同样的事情时,我得到29作为索引-1的值。
在这种特殊情况下,您的程序似乎从不同的数组中读取值(即arr1
中的最后一个值)。但这仍然是未定义的行为,因此这样做会导致程序无效。
答案 1 :(得分:1)
C和C ++中的负数组索引非法。它在C中被调用undefined behaviour。
来自C11§6.5.2.1数组下标
后缀表达式后跟方括号
[]
中的表达式 是数组对象元素的下标。的的 下标运算符[]
的定义是E1[E2]
与(*((E1)+(E2)))
相同。由于转换规则 如果E1
是数组对象,则应用于binary +运算符 (等效地,指向数组对象的初始元素的指针) E2是一个整数,E1[E2]
表示E1
的第E2个元素 (从零开始计算)。
Clang编译器生成警告
warning: array index -1 is before the beginning of the array [-Warray-bounds]
printf("Nummer -1: %d\n",arr1[-1]); //outputs 0