C语言中的数组越界

经常用C语言的都知道,C语言是不检查数组越界的问题的。

先看这样一段程序

int main() {
	int i;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++) {
		printf("哈哈\n");
		arr[i] = 0;
	}
	return 0;
}

请问输出结果是什么?

一眼看去虽然数组越界了但是程序还是能运行的,循环13次,应该输出13个“哈哈”。我一开始也是这样想的,但是在机器上一运行,惊了,是死循环,无限打印“哈哈”。

打开调试一步一步走,这里我直接将arr[10]、arr[11]、arr[12]都监视了,竟然发现i和arr[12]的变化是一致的。当i = 9时如下

C语言中的数组越界

当i=11时,发现arr[10]、arr[11]都置0了,再继续走

C语言中的数组越界

当i = 12 进入循环后,执行arr[i] = 0

C语言中的数组越界

i 和 arr[12]都变成0了。i = 0 后又能进入循环,估计再执行一遍的结果还是一样,这就是死循环。

一开始我们就知道i和arr[12]的变化是一致的,很容易想到地址,那么取地址

C语言中的数组越界

i和arr[12]的地址是一样的!!!

之后我把int i 和定义数组 int arr[] 的位置换了一下,先定义数组在定义 i,执行后有一个Debug Error,不知道为何会这样。

C语言中的数组越界

虽然不知道为什么是这样存储 i 的值的,但是以后写代码中要格外注意数组越界问题,最好用sizeof(arr)/sizeof(arr[0])来获取数组元素个数。