调试的一些相关技巧(小白版)+一段有趣的代码

一个优秀的程序员肯定是对调试很熟悉的,不然也不可能找到工作,所以我们在进行编程学习的时候,一开始是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,造成了程序死循环。

温馨提示:小白编写,可能会有讲解不到位的地方,望各位读者海涵,程序有什么错误,请各位多多提建议,我在这里表示感谢!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值