我卡在C中的输出(多维数组操作)

时间:2014-08-22 15:27:01

标签: c arrays

#include <stdio.h>
void main()
{
    int arr[3][2]={2,3,4,5,6,7};

    printf("%d\n",arr);
    printf("%d\n",arr[1]);
    printf("%d",arr[1][2]);
}

在Borland Turbo C ++中编译时的上述代码给出了输出

8682
8686
6

我不明白这个程序是如何运作的。据我所知,在打印arr时,它返回基址为8682,arr[1]返回下一个地址位置8686(整数为4个字节)但为什么arr[1][2]不会像{{1}那样闪烁错误超出界限?

3 个答案:

答案 0 :(得分:0)

在C中,超出数组访问不会引发错误 - 事实上它甚至不进行任何检查!相反,系统只会访问内存中发生的任何事情(C程序的主要危险之一)。

以下是对此处发生的事情的解释。在这里使用此代码:

arr[1][2]

内部实际上看起来像这样:

*(arr + 1 * 2 + 2)  // the 2 comes from the second dimension size of the array

内部的2D数组存储为一维数组,每行位于前一行之后:

arr[3][2] = {2, 3, 4, 5, 6, 7};
// is the same as
arr[6] = {2, 3, 4, 5, 6, 7};

arr[1][2]的数学运算可以用来访问arr[5],这就是为什么你得6作为值。

答案 1 :(得分:0)

严格地说,它是未定义的行为。但是,如果你看一下如何处理数组索引,你会发现它为什么起作用。

arr
|
v
+-----+-----+-----+-----+-----+-----+
|  2  |  3  |  4  |  5  |  6  |  7  |
+-----+-----+-----+-----+-----+-----+

arr[0]
|
v
+-----+-----+-----+-----+-----+-----+
|  2  |  3  |  4  |  5  |  6  |  7  |
+-----+-----+-----+-----+-----+-----+

            arr[1]
            |
            v
+-----+-----+-----+-----+-----+-----+
|  2  |  3  |  4  |  5  |  6  |  7  |
+-----+-----+-----+-----+-----+-----+

               arr[1][0]
               |
               v
+-----+-----+-----+-----+-----+-----+
|  2  |  3  |  4  |  5  |  6  |  7  |
+-----+-----+-----+-----+-----+-----+

                           arr[1][2]
                           |
                           v
+-----+-----+-----+-----+-----+-----+
|  2  |  3  |  4  |  5  |  6  |  7  |
+-----+-----+-----+-----+-----+-----+

答案 2 :(得分:0)

  

为什么arr [1] [2]没有闪烁错误,因为arr [1] [2]超出范围

如果我的记忆对我有用,C不会抱怨数组越界错误。它只会让你走出界限。