c语言研究死循环的原因(例码)

目录

一.代码

总结



一.代码

#define _CRT_SECURE_NO_WARNINGS 1
#include
int main() {
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++) {
		arr[i] = 0;
		printf("hehe\n");
	}
	return 0;
}

从代码简单的角度来看这只不过是数组访问越界的问题!

所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最常见的错误之一。 在 C 语言中,数组必须是静态的。 换而言之,数组的大小必须在程序运行前就确定下来。

然而问题就这么简单吗?仔细想想这个代码运行后的结果是什么?

打印13个hehe,那让我们把程序运行起来,让我们看一下!

c语言研究死循环的原因(例码)_第1张图片

为什么会这样子呢?怎么想也不会是死循环啊!

既然和我们想的不一样,那我们就调试走起,看看是哪里出了问题.

c语言研究死循环的原因(例码)_第2张图片

 我们发现当i=9时一切的程序很正常,这里调试的同时我也把越界的数组也监视出来,及arr[12],和i的地址监视出来,便于大家更好的理解.

接下来我们继续往下调试!

c语言研究死循环的原因(例码)_第3张图片

 从这次调试来看,当i=11时,很正常的将arr[10],arr[11]更改成了0,但为什么arr[12],居然和i的值变得一样,而且arr[10],arr[11]在开始时都是一个随机值,而arr[12]不一样,这是我们有一个大胆的猜想,会不会i和arr[12]的地址是相同的,为了验证猜想我们接下来在继续调试!

c语言研究死循环的原因(例码)_第4张图片 

如上图经过调试,果然当arr[12]改变成0时,i的值也随只改变成0,这样如此循环下去,就会陷入死循环,猜想验证成功!

我们知道数组中的元素是从低地址到高地址进行存储的,所以我们可以推断出该段代码在内存中是如何存储的.

c语言研究死循环的原因(例码)_第5张图片

 首先在栈空间的高地址,开辟空间给i,然后在低地址开辟一块地址给arr数组,由于数组的存储是由低地址到高地址的,所以当数组越界时就会出现数组元素越到了i,使得arr[12]和i为同一块地址.

当然这是debug版本,称为调试版本,还有一个版本为release版本,该版本称为发布版本,这两个版本的区别是:Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。. Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

那我们接下来在看看release版本的运行!

c语言研究死循环的原因(例码)_第6张图片

 哦,我们发现release版本下程序不会陷入死循环,这又是为什么呢?

这原因是release版本在开辟空间是他会将数组的地址高于i的地址这样即使数组越界也不会干扰到i.

c语言研究死循环的原因(例码)_第7张图片 

 

 


总结

这篇文章解决的是c语言中,数组越界访问导致死循环的问题,通过运行结果,寻找问题,调试代码,猜想假设,验证猜想,熟悉了解调试代码的过程,希望可以帮助到各位小伙伴,由于刚开始写文章,如果有错误的话请进行提出,我欣然接受各位的建议!

你可能感兴趣的:(c++,c语言)