解释输出(C中的二维数组)

时间:2014-03-24 05:16:05

标签: c multidimensional-array

我编写的代码如下:

#include<stdio.h>
    int main() {
        int arr[3][2]={{1,2},{3,4},{5,6}};
        printf("%d %d %d",arr[0][3],arr[1][2],arr[2][0]);
        return 0;
    }

(GCC)输出是:

4 5 5

请解释此输出。根据我的方法,代码应该抛出一个错误,因为没有列索引为3或2。

2 个答案:

答案 0 :(得分:2)

这是有缺陷的代码。你的数组边界超出范围。但是,他们显然仍然参考实际数据。如果您有一个多维数组arr[NUMROWS][NUMCOLS],则该数组仍然连续存储在内存中。要访问元素arr[x][y],您需要查找位置x*NUMCOLS+y中的元素。对于你的问题,arr在内存中存在为1 2 3 4 5 6. arr[0][3]指的是索引0 * 2 + 3处的元素,这是4 (记住数组是0索引的)。同样,arr[1][2]对应 1 * 2 + 2 = 4,即5 。最后arr[2][0] = 2*2 + 0=4,所以再次获得5

答案 1 :(得分:0)

在C中,如果访问数组的边界,则无法保证抛出错误。实际上,C标准没有要求编译器在这种情况下必须做什么。这样做的原因是编译器可以为合法程序生成最佳输出,而不必担心会阻止你在脚下射击。