C中的2D数组索引怎么样?

时间:2013-08-05 22:08:53

标签: c multidimensional-array indexing

我是C编程的新手,我需要使用2D整数数组(矩阵)。例如,我这样做:

void main(){
   int matrix[2][2] = { {0,1}, {2,3} };
   printf("%i", matrix[4][4]); /*Here should be an index error, but that doesn't happen*/
}

有什么问题?

4 个答案:

答案 0 :(得分:5)

  

有什么问题?

您对编译器和/或语言的假设是错误的。 C没有边界检查。如果您正在访问数组越界,编译器将不会发出警告。

相反的是:您的代码现在无效,据说可以调用未定义的行为,并且可以随意执行任何操作(包括崩溃或看似“工作正常”)。

答案 1 :(得分:1)

这是undefined behavior,与其他语言不同,C不进行边界检查,C99 draft standard的附件J.2 Undefined behavior给出了这个具体的例子:

  

- 数组下标超出范围,即使某个对象显然可以使用   给定下标(如左边的表达式a [1] [7]给出声明int   a [4] [5])(6.5.6)。

答案 2 :(得分:0)

C不对数组索引执行边界检查。这可能导致一个错误和缓冲区溢出,但它也允许您的代码运行得更快。作为C程序员,您有责任确保仅使用有效索引。

答案 3 :(得分:0)

根据说,

C没有索引错误。它不进行索引检查。在C语言中,程序员是全能的,所以你所做的一切都是“合法的”,因为它将编译和运行。当您执行matrix[4][4]时发生的事情是未定义的行为。你正在索引堆栈的某个地方并抓住那里的东西并将其解释为int。如果您尝试访问matrix[300][200]中的一些荒谬的数组绑定,则很可能会出现分段错误。