int main() { int i = 0; int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hello bit\n"); } return 0; }
大家可以看到,这个看似简单的代码,一眼看上去这段代码存在的错误就是数组越界访问了,但是越界访问一般都是程序直接崩溃的,但是这里居然是死循环的一个结果,这是什么原因呢?相信绝大部分C语言的初学者是看不出来原因的,包括一部分的对C语言比较熟手的同学也不知道这是个什么原因,那我们今天就来研究研究它到底是什么原因导致死循环。
对于运行时错误,我们只能通过调试的方法试着找找原因了。
在调试时你会发现arr[12]的值和i的值始终相等,当i=12的时候,再按一次F10,你会发现i的值又变回了0,如上图所示,原来原因就在这里,每次当i=12的时候arr[12]被改成0的同时i又被改成0了,所以i<=12恒成立,也就是说这个循环无法跳出,所以造成了死循环,但是为什么改变arr[12]的值的时候i会跟着改变呢?难道它们两个的地址相同的?答案是肯定的。确实它们都地址是相同的。结合以下这张图理解你就懂了。
由于i变量是先创建的 ,而数组是后创建的,所以i在高地址,arr在低地址,而在VS编译器底下i刚好是数组arr下标为12的元素的位置,所以当访问到arr[12]的时候刚好访问到i,所以i也被改成了0,就导致的死循环了,所以数组越界访问真的会造成你意想不到的结果的,你以后还敢越界访问数组吗?