我是 C 编程新手,我需要使用二维整数数组(矩阵)。例如,我这样做:
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*/
}
怎么了?
我是 C 编程新手,我需要使用二维整数数组(矩阵)。例如,我这样做:
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*/
}
怎么了?
怎么了?
错误是您对编译器和/或语言的假设。C 没有边界检查。如果您越界访问数组,编译器不会警告您。
相反会发生什么:您的代码现在无效,据说会调用未定义的行为,并且可以自由地做任何想做的事情(包括崩溃或看似“工作正常”)。
这是未定义的行为,不像其他一些语言 C 不做边界检查和附件J.2 Undefined behavior
给出C99 draft standard
了这个特定的例子:
— 数组下标超出范围,即使对象显然可以使用给定的下标访问(如在给定声明 int a[4][5] 的左值表达式 a[1][7] 中)(6.5.6) .
C 不对数组索引执行边界检查。这可能会导致错误和缓冲区溢出,但它也可以让您的代码运行得更快。作为 C 程序员,您有责任确保只使用有效的索引。
据说,C 没有索引错误。它不进行索引检查。在 C 语言中,程序员是万能的,所以你所做的一切都是“合法的”,因为它会编译和运行。当您这样做时matrix[4][4]
,正在发生的事情是未定义的行为。您在堆栈上的某个地方建立索引并抓取那里的任何内容并将其解释为 int。如果您尝试访问一些可笑的数组绑定,matrix[300][200]
那么您很可能会遇到分段错误。