C语言中我们常见写出来的代码死循环了,死循环的原因又有很多种,接下来介绍一种由于数组越界而导致的死循环。
问题如下
#include <stdio.h>
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\n");
}
return 0;
}
我们可以看到,当代码跑起来后,并没有报错,而是陷入了死循环打印hello。
当我们凭判断无法找出问题根源所在时可以进入调试。
我们可以看到当i的值发生变化时,arr数组里面元素的值也在相应的变化,一切都按照我们所想的在变。
发现当i等于9时,arr[9]也确实变成了0,而当i再次增加变成10的时候,数组越界,而代码并没有报错,而是将arr[10]也变成了0。
再增加到11时,arr[11]也对应的变成了0。
当增加到12时,arr[12]也变成了0,循环也应该到此结束。
但是经调试窗口所见,i也变成了0,循环并未结束,再一次进入了循环,那么这是为什么?
我们把i的地址和arr[12]的地址调出来对比,发现时一样的,那么说明i和arr[12]占用的时同一块内存空间,它俩总是同时在变化。
这是因为栈区总是先使用高地址处的空间,再使用低地址处的空间,而数组随着下标的增长,地址是由低向高变化,所以就造成了i的地址和arr[12]的地址相同。
总结
for循环中,i的内容是从0,一直增加到12,而数组只有10个空间,因此会越界,每次访问arr数组i号位置时,都会将该位置内容设置为0,当访问到arr[12]时,也会将该位置内容设置为0,而位置恰好为i的位置,即a[12]恰巧将i设置为0,因此造成死循环。
当然这也是取决于编译器以及环境的问题,因环境而异,并不是i和arr之间一定为两个整型的空间,例如vc6.0中就没有多余的空间,gcc中有一个整形空间,所以还是因环境而异。
不足之处请各位大佬批评指正,共同交流进步!