C包含数组

时间:2017-11-18 12:03:18

标签: c arrays

我有两个数组,我必须得到特定指数的值。在做这件事的时候,我觉得很奇怪。当我打印出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编译器

2 个答案:

答案 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