C语言的实用调试技巧(内含模拟strlen,strcpy库函数的实现,const,assert的使用实例)

1.什么是bug?

第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。

2.调试是什么?

调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程
序错误的一个过程

拒绝-迷信式调试!!!!

调试的基本步骤:

1.发现程序错误的存在(程序员,调试人员,用户)
2.以隔离、消除等方式对错误进行定位
3.确定错误产生的原因
4.提出纠正错误的解决办法
5.对程序错误予以改正,重新测试

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优
的,以便用户很好地使用。

 请看如下代码:

 如果是 debug 模式去编译,程序的结果是死循环。


如果是 release 模式去编译,程序没有死循环。


那他们之间有什么区别呢?
就是因为优化导致的。

3.1 调试环境的准备

 在环境中选择 debug 选项,才能使代码正常调试。

3.2 学会快捷键

 最常使用的几个快捷键:

F5
启动调试,经常用来直接跳到下一个断点处。

F9
创建断点和取消断点
断点的重要作用,可以在程序的任意位置设置断点。
这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。

F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是
最常用的)。

CTRL + F5
开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

在调试开始之后,用于观察变量的值。

VS中常用的快捷键博客:

VS中常用的快捷键_vs快捷键-CSDN博客文章浏览阅读7.2w次,点赞240次,收藏757次。我一直认为“工欲善其事,必先利其器”,作为一个开发者,我们所用的“器”就是我们常用的软件开发工具,在进行Asp.net开发的时候,我们无时无刻在和Visual Studio打交道;因此为了提高自己的开发效率,掌握常用的快捷键就显得尤为重要,下面是我对快捷键的一些总结以及我自己对快捷键记忆的一些理解,分享出来,希望对大家有用。_vs快捷键https://blog.csdn.net/mrlisky/article/details/72622009

 在调试开始之后,用于观察内存信息。

查看调用堆栈

 通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置

查看汇编信息:可以切换到汇编代码。

查看寄存器信息:可以查看当前运行环境的寄存器的使用信息。

 一些调试的实例:

实现代码:求 1!+2!+3! ...+ n! ;不考虑溢出。

错误原因分析: 

 

通过调试修改后成功的代码:

 

 实例二:

 

 由监视发现i和arr[12]竟然是一个空间。

然而在release版本里运行出来就是正确的:

 这是因为编译器自行优化了其中的代码,将局部变量i和arr在栈区的地址的高低位互换了位置,可谓是相当的强大。

常见的coding技巧:
1. 使用assert
2. 尽量使用const
3. 养成良好的编码风格
4. 添加必要的注释
5. 避免编码的陷阱。

模拟实现库函数:strcpy

如果不采用库函数的方式,自己来写这个函数:

版本一:

 改进版本二:

改进版本三:

 改进版本四:

 接下来我们来看看强大的const的作用:

结论:
const修饰指针变量的时候:
1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改
变。但是指针变量本身的内容可变。
2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指
针指向的内容,可以通过指针改变。

 改进版本五:

 改进版本六:

可以看出从版本一 到版本六,很明显从版本一到版本六层层递进,每一种都可以实现相应功能,但是明显最后几种版本会更好。

最后要注意几个strcpy使用的陷阱:

1.在字符串里面一定要包含'\0'

2.目标空间要保证足够大

3.目标空间必须可修改

模拟实现一个strlen函数:

这里我们使用的返回类型是int,而库函数的返回类型是unsigned int,但是库函数在一定的情形下也会出现问题,实例如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~|Bernard|

你的鼓励是我写下去最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值