目录
程序代码
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(i = 0; i <= 12; i++)
{
printf("hehe\n");
arr[i];
}
return 0;
}
原因分析
要明白这个程序为什么会陷入死循环(明明看起来很正常啊)?就要先了解一点数组和堆栈的知识。
前置知识
数组
数组在内存中的使用是遵循以下规则的:
1.连续存放
2.随着数组下标的增长,数组元素从低地址向高地址占用内存
堆栈
堆栈的使用遵循以下规则:
1.先进先出,后进后出
2.先使用高地址,再使用低地址
原因
有了上述的知识,我们不难画出,该程序在内存中的样子
随着程序的进行,数组中的元素逐渐被重新赋值为0。当i=10时,i仍然小于12,循环继续,但此时的arr[10]并非我们定义的元素,程序开始越界访问。
当程序越界访问到arr[12]时,arr[12]与i的地址相同,给arr[12]赋值为0,即为将i赋值为0,将i重新置为0,又重新开始循环。这就导致了程序陷入死循环!
所以就算i设置的不是12,也有可能出现死循环,只要数组持续的往高地址越界,只要越界的数合适,就能将i重新置0!
解决办法
将int变量i,放在数组定义的后面,即
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;