本篇内容主要讲解“C语言数组越界引发的死循环问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言数组越界引发的死循环问题如何解决”吧!
下面的程序在VS编译器会出现什么问题?运行结果是什么?为什么?
#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; }
运行结果:
如下图:代码死循环
上述代码有两个问题:
数组访问越界死循环
1、i和arr都是局部变量,在内存中局部变量都是存储在栈区的。
2、数组随着下标的增长,地址是由低到高变化的。
3、栈区的内存规定:先使用高地址处的空间,再使用低地址处的空间。
根据上述代码可知,程序会先在栈区中高地址处为变量i
开辟空间,再在栈区中由高到低依次为数组arr
开辟空间
如下图????
通过调试我们可以在内存中观察到如下变化:
for循环中,i 的内容是从0,一直增加到12,而数组只有
10
个空间,因此会越界,每次访问arr数组i号位置时,都会将该位置内容设置为0,当访问到arr[12]时,也会将该位置内容设置为0,而位置恰好为i的位置,即arr[12]
恰巧将i
设置为0
,因此造成死循环。
上述代码在不同的编译器中具有不同的效果,并且与运行环境有关。
在VS2013/2019/2022的x86环境中,i和arr间相隔两个整形。即i<=12
就死循环在gcc中间空相隔一个整形。即i<=11
就死循环在VC6.0中间没有多余的空间。即i<=10
就死循环
到此,相信大家对“C语言数组越界引发的死循环问题如何解决”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。