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时如下
当i=11时,发现arr[10]、arr[11]都置0了,再继续走
当i = 12 进入循环后,执行arr[i] = 0
i 和 arr[12]都变成0了。i = 0 后又能进入循环,估计再执行一遍的结果还是一样,这就是死循环。
一开始我们就知道i和arr[12]的变化是一致的,很容易想到地址,那么取地址
i和arr[12]的地址是一样的!!!
之后我把int i 和定义数组 int arr[] 的位置换了一下,先定义数组在定义 i,执行后有一个Debug Error,不知道为何会这样。
虽然不知道为什么是这样存储 i 的值的,但是以后写代码中要格外注意数组越界问题,最好用sizeof(arr)/sizeof(arr[0])来获取数组元素个数。