程序员必备技能——调试技巧(二)

简介: 程序员必备技能——调试技巧(二)



一.前言

上文我们提到了许多关于调试的小技巧,接下来我们来应用调试技巧对更多例子进行纠错修整。

二.案例

2.1 例1

这时候我们就需要用调试来查看各项数值是否正确。我们输入3:

可以看到求1的阶层各个数值是没问题的。

2的阶层也没有问题。

3的阶层反而出现问题了,ret应该是6但缺变成了12.那就可以推测ret原来是有数值2的,而凭空多出来的2是上一次2的阶层保留下来的结果,我们没能对ret及时初始化才照成错误。

2.2 例2

在有数组越界的问题中,程序无限循环地打印hehe。

下面我们先改变数组元素,然后来调试查看错误。

当我们改到下标9时目前是正常的,刚好打印10个hehe。

前2次越界的数组都是随机值,都可以改为0.

当我们查看i=12时,情况发生了变化。如果我们尝试改为0,发现i与arr[12]都变成0了。

我们查看二者地址发现是一样的。正因为地址一样,所以i是没有限制的,每次一到12就又变成0.

我们最后发现这是一个巧合(i和arr之间因为编译器的原因刚好空2格),在vs2022的x86环境中(不同的编译器arr和i的空格不一样),i的内存刚好在12处,而数组越界又刚好能到12,所以不管i后续是13还是14等,只要到了12,因为地址一致的缘故都会重新跟着arr[12]变为0.

我们切换到release版本来验证发现是正常的。

打印地址发现i变小了,按照debug的话i的地址是要在arr后面的。它把i与arr在内存中的位置更改了,这样就不会发生越界现象。这就是release优化。

三.如何写出好(易于调试的代码)的代码

3.1 优秀的代码

 

3.2 示范

实现strcopy功能:

改良后的代码:通过字符的阿斯马值来作为条件判断,只有遇到字符‘0’时才不进入循环。

当数组有一个是空指针时,我们可以加入一个空指针的阻拦条件(assert——断言),在函数中宏定义断言,这样当断言内容触发时就会显示有问题的地方。

小细节:创造一个字符变量存储dest,确保返回的是初始地址(因为原dest的地址已经指向数组某一处去了,不再是起始地址。)

 

3.3 const的作用

正常情况下Num的值是不会被修改的,但把Num的地址传输给指针变量反而修改了num。

const放*左边时限制*p,数值无法修改。

const放*右边时限制p,地址无法接收。

同理如果在*两边都加上const,那么*p不能改数值,p不能接收地址。

不希望src里面的数值被修改,那么可以在接收的时候在*左边加上const.

 

相关文章
|
2月前
|
NoSQL 编译器 C语言
【C 言专栏】C 语言中的调试技巧与工具
【5月更文挑战第6天】在C语言编程中,调试是必不可少的技能,涉及基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查和性能分析。通过分析问题、设置断点、逐步调试和检查逻辑来解决错误。调试时需保持耐心,合理选用工具,记录过程,并避免过度调试。熟练掌握这些技能将提升代码质量和开发效率。
【C 言专栏】C 语言中的调试技巧与工具
|
11月前
|
程序员
编程终极技能-调试(下)
编程终极技能-调试
|
2月前
|
程序员 Windows
程序员必备技能——调试技巧
程序员必备技能——调试技巧
46 0
|
11月前
|
程序员 编译器
编程终极技能-调试(上)
编程终极技能-调试
|
11月前
|
人工智能 自然语言处理 程序员
《游戏测试》编写 Prompt 将成为程序员的必修课
《游戏测试》编写 Prompt 将成为程序员的必修课
|
IDE NoSQL 程序员
必备技能:程序的调试
本节内容相对来说比较笼统一些,但是也是非常非常非常重要的一节内容,毕竟一个程序猿不能只会写bug,你写一堆bug谁来修呢?所以通过调试去排查错误的能力是一个优秀的程序猿必须要掌握的技能,而且不能仅仅是掌握,更要精通,本节内容总体来说只有两大部分,一是学习调试的方法,会有举例实际去感受一下,二是在写代码就要考虑的一些问题,养成良好的写代码习惯,防患于未然。
必备技能:程序的调试
|
网络协议 Java
编程技能强化代码知识点整理
编程技能强化代码知识点整理
139 0
|
存储 Java 测试技术
【高效编码】关于IDEA调试的点点滴滴都在此文了。领导看了都说好!!!!
您好,我是码农飞哥,感谢您阅读本文!如果此文对您有所帮助,请毫不犹豫的一键三连吧。小伙伴们,有啥想看的,想问的,欢迎积极留言告诉我喔。 前面我写了一篇低效编码的文章,我很痛心。
145 0
【高效编码】关于IDEA调试的点点滴滴都在此文了。领导看了都说好!!!!
|
程序员 编译器 C语言
程序员必备的VS调试技巧
程序员必备的VS调试技巧
139 0
程序员必备的VS调试技巧
|
消息中间件 设计模式 存储
丁威: 优秀程序员必备技能之如何高效阅读源码(二更)
丁威: 优秀程序员必备技能之如何高效阅读源码(二更)
丁威: 优秀程序员必备技能之如何高效阅读源码(二更)