C中遇到一个诡异的死循环

下面是其代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     int i = 0;
 6     //int j = 0;
 7     int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 8     for (i = 0; i <= 12; i++)
 9     {
10         printf("hello\n");
11         arr[i] = 0;
12     
13     }
14     system("pause");
15     return 0;
16 }

代码运行结果应该是换行打印13个hello,但是程序运行后发现程序进行死循环,无限打印hello.

经过调试发现当i==12的时候,再进行循环判断的时候i的值突然变成0了

 

当i==12运行完循环时,应该是返回判断语句变成i==13,退出循环,而这时却是i突然等于0,而陷入死循环

 

这时arr数组内元素都赋值成0了,但循环又重新开始了

经过排查,如果注释掉 //arr[i]=0;发现程序能正确输出结果,判断原因是不是数组越界访问造成的问题

经过在监视窗口中加入arr[10],a[11],arr[12]和查看i和arr[12]的地址发现了问题

越界访问的arr数组第13位置的时候,系统分配的位置,居然是系统给i变量分配的地址,两个地址是一样的,这才是造成死循环的原因

这时也体会到非法访问内存 的弊端,会造成莫名其妙的错误 。还有发现系统给局部变量开辟内存的时候喜欢分配比较相邻的内存单元

这段带码在声明i变量时,就是在第6行加上一句int j=0;也可以避开这个死循环,改变系统分配内存的位置

posted @ 2023-07-18 17:00  晴天_雨水  阅读(41)  评论(0)    收藏  举报