这样修改之后,得到的答案就是正确的了:
运行结果
百度
这样就完成了一次完整的debug过程,当然,这个bug是在一个非常简单的代码中的一个简单的bug,所以可能你不需要经过这些步骤就能很快地定位到问题所在,但如果是一个很庞大的项目中出现的bug,标准的debug流程就显得十分重要了!

7. 调试举例2

VS2022、X86、Debug 的环境下,编译器不做任何优化的话,下面代码执行的结果是什么?

#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;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

很容易发现这个代码数组遍历越界了,正常情况下应该是程序崩溃,但结果真的如此吗?
我们运行起来看一看:
运行
通过右边的很小的滑动条你应该就能发现:这个代码死循环了。
可是,为什么呢?

我们调试起来看一看:
2
调试到这一步,不知道你注意没有,此时iarr[i],也就是arr[12]的地址竟然是一样的,那死循环就很好理解了,arr[12] = 0,这一步将i也赋值为0,循环无法达到结束条件,也就无法停止了

可是,为什么i会和arr[12]重合呢?

我们知道局部变量是存储在栈区的,

  1. 栈区内存的使用习惯是从高地址向低地址使用的,所以变量i的地址是较大的。arr数组的地址整体小于i的地址。
  2. 数组在内存中的存放是:随着下标的增长,地址是由低到高变化的。

如图:
1
所以根据代码,就能理解为什么是上图的代码布局了。
如果是上图的内存布局,那随着数组下标i的增长,往后越界就有可能覆盖到i,这样就可能造成死循环的。

这里你可能还有疑问:为什么iarr数组之间恰好空出来2个整型的空间呢

这里确实是巧合,在不同的编译器下可能中间的空出的空间大小是不一样的,代码中这些变量内存的分配和地址分配是编译器指定的,所以的不同的编译器之间就有差异了。所以这个题目是和环境相关的,如果换一个环境,可能代码就不会死循环而是报错了。

从这个理解我们能够体会到调试的重要性,只有调试才能观察到程序内部执行的细节,就像医生给病人做B超,CT一样。

注意:栈区的默认的使用习惯是先使用高地址,再使用低地址的空间,但是这个具体还是要编译器的实现,
比如:在VS上切换到X64,这个使用的顺序就是相反的,在Release版本的程序中,这个使用的顺序也是相反的。
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

调试过程中,要做到心中有数,也就是程序员自己心里要清晰的知道希望代码怎么执行,然后再去看代码有没有按照我们预定的路线在执行。
调试是需要反复去动手练习的,调试是可以增加程序员对代码的理解和掌控的,掌握了调试的能力,就能看到本质,就像能给程序做B超一样,对程序内部一览无余。

9. 编程常见错误归类

9. 1 编译型错误

编译型错误一般都是语法错误,这类错误一般看错误信息就能找到一些蛛丝马迹的,双击错误信息也能初步的跳转到代码错误的地方或者附近。编译错误随着语言的熟练掌握,会越来越少,也容易解决。

1

9.2 链接型错误

看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是因为:

标识符名不存在
拼写错误
头文件没包含
引用的库不存在
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

2

9. 3 运行时错误

也就是逻辑错误。
运行时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运行时错误

谢谢你的阅读,喜欢的话来个点赞收藏评论关注吧!
我会持续更新更多优质文章

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/fhvyxyci/article/details/141229395","extend1":"pc","ab":"new"}">>
注:本文转载自blog.csdn.net的fhvyxyci的文章"https://blog.csdn.net/fhvyxyci/article/details/141229395"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!