我是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*/
}
有什么问题?
答案 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]
中的一些荒谬的数组绑定,则很可能会出现分段错误。