一个优秀的程序员肯定是对调试很熟悉的,不然也不可能找到工作,所以我们在进行编程学习的时候,一开始是80%的时间写代码,20%的时间进行调试,到后面越来越熟悉之后,就会变成20%的时间写代码,80%的时间进行调试,因为对于已经很熟悉代码的程序员来说,代码的书写不在需要那么多时间了,但是其中会出现BUG,这就需要慢慢调试来解决
F5:开始调试,基本上会用来执行到断点处
F9:设置断点
F10:逐过程,可以是函数,可以是一条语句
F11:逐语句,可以进入到函数内部
……
不知道大家有没有过这种经历,就是用VS的时候,想调试,但是一开始不知道在哪里调试,后面看老师调试之后,也想自己来调试一下,可是连调试的窗口都看不见
就像这样子:
然后一直找监视窗口,内存窗口……怎么找都找不到(我自己有过一次这样子的经历),在这里温馨提示,所有调试的窗口都是要进行调试之后才能找到,就像这样子:
也就是按了F10开始调试之后才会有这样子的窗口。
好了,举个例子,但是这个例子仅限于VS X86 debug版本下的一段代码(一段有趣的代码):
#include<stdio.h>
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;
}
我们运行一下:
程序死循环的进行了打印hehe,但是我们很奇怪,按道理来说,这不是访问越界了吗?
arr这个数字大小为10啊,下标从0~9啊,为什么会访问到arr[12],而且还死循环的打印了hehe,这个时候,我们只能用调试进行检查:
这里我们可以看到,程序还是正常运行的,但是接下来就会越界访问了:
而且越界访问居然成功了,arr[10],arr[11],arr[12]都被访问了,这个arr胆子也太大了,但是当程序再次运行的时候就会出现这个样子:
全部变成0了,而且继续运行你会发现,i和arr[12]竟然相同,而且会同步改变:
这个时候我们&arr[12],和&i看看,惊奇的发现,哦!!原来它俩的地址竟然相同:
是不是惊掉了你的下巴!!没错就是以为i和arr[12]的地址是相同的,所以明明越界访问了,但是没时间去报错,而是不停的打印hehe,以为i<=12的条件永远都会满足,以为每当arr[12]=0之后,i=0这样子死循环了。出现这个现象的原因是因为,栈区的内存使用习惯是:从高地址向低地址使用,而刚好数组是随着下标从低地址向高地址使用的,刚好在这个环境下,i的地址刚好和arr中间隔了两个空也就是arr[10]和arr[11],8个字节,所以就刚刚好够到了i,造成了程序死循环。
温馨提示:小白编写,可能会有讲解不到位的地方,望各位读者海涵,程序有什么错误,请各位多多提建议,我在这里表示感谢!!!!