一段诡异的代码——调试的重要性

调试

调试(Denugging/Debug),又称为出错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

调试的步骤

  • 发现程序错误的地方
  • 以隔离、消除等方式对错误进行定位
  • 确定错误产生的原因
  • 提出纠正错误的解决办法
  • 对程序错误予以改正

一段诡异的代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
    
    
	int i = 0;
	int arr[10] = {
    
     0 };
	for (i = 0; i <= 12; i++)
	{
    
    
		arr[i] = 0;
		printf("hello world!\n");
	}
	return 0;
}

表面上,这段代码,就是简单的数组越界,arr数组只有0——9;可是for循环,访问到了12,然后程序应该就结束了。
但是实际结果,程序陷入了死循环。如下图:
在这里插入图片描述
我们可以将数字i打印:
如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
    
    
	int i = 0;
	int arr[10] = {
    
     0 };
	for (i = 0; i <= 12; i++)
	{
    
    
		arr[i] = 0;
		printf("hello world!%d\n",i);
	}
	return 0;
}

在这里插入图片描述
可以看到,上面代码,一直从0打印到11,然后又从0开始,陷入死循环中。这是为什么呢?
我们一直看,一直看,也看不出来,这就需要调试了。

调试

我们知道,在栈区,变量为向下生长的(即:地址为高–>低),因为变量i先定义,所以i的地址,相对于后定义的arr地址要高。
虽然在栈区,变量是向下生长的,但是数组的地址是由低到高的。
打开调试:找到arr和i在内存中的地址。经过初始化后,arr和 i在内存中,都初始化为0;

在这里插入图片描述
进一步调试:
在这里插入图片描述
我们可以看到,for循环中i一直++,当i==12得到时候,数组越界,将arr[12]和i的地址中的数改为0;这样i又为0;这样程序就会一直死循环。

所以,简单的错误,我们也没有想到会造成死循环,如果仅凭眼睛看, 很难发现错误,所以调试还是很重要的

猜你喜欢

转载自blog.csdn.net/weixin_52142731/article/details/111461445
今日推荐