一段诡异的代码——调试的重要性
调试
- 调试
- 调试的步骤
- 一段诡异的代码
- 调试
调试
调试(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;这样程序就会一直死循环。
所以,简单的错误,我们也没有想到会造成死循环,如果仅凭眼睛看, 很难发现错误,所以调试还是很重要的。
还没有评论,来说两句吧...