结构体入门&调试技巧(二)

简介: 结构体入门&调试技巧(二)

三.调试技巧


 调试的出现是为了解决程序的bug,这里不得不提一下计算机史上第一个bug的故事~。


 起初,计算机占地很大,有一两个房间的大小,计算机前人在执行程序的时候,程序跑不过去,于是检查完逻辑,便跑到房间里寻找硬件哪里出错了,最后在一根晶体管里发现一只死去的虫子。清理掉后,换了一根晶体管,程序就跑起来了,这个虫子引起的错误被称为bug,后来bug常用来描述代码运行错误,程序出错的情况。


3.1VS里的版本

 在VS编译器里有可以调的生成可执行程序的版本,一个是Debug版本,一个是Release版本。


 Debug版本是程序员在写代码时使用的,包含调试信息,可以进行调试,在大小,运行速度上不做任何优化。


 Release版本是发行版本,不包含调试信息,是测试人员测验程序满不满足客户要求,有没有存在隐藏性的致命bug等,也是客户使用的版本。编译器会对代码进行优化,使得下载的的大小少,运行速度快。


3.2调试功能介绍

 ctrl+f5是不调试执行,一口气跑完程序,也就是跑代码,运行起来。


 fn+f9是打断点的功能,它配合fn+f5使用。当我们为某一行代码打上断点,再按fn+f5,会让程序的执行到断点处停下来。但ctrl+f5遇到断点不会停下来,因为它是不调试执行。还要需要注意的是,当没有断点的时候,fn+f5和ctrl+f5是一样的,因为没有断点拦住fn+f5。


 补充:如果读者的电脑没有取消fn这个功能键,就需要按fn+f5、fn+f9这样子,如果已经取消的读者,可以直接按f5表示调试执行,f9打断点。博主没有取消掉fn的功能键,所以需要按fn。


 fn+f10逐过程调试,代码一个过程一个过程的走,遇到调用函数也是直接执行完。


 fn+f11是逐语句调试,代码一句一句的走,遇到调用函数会进入函数内部执行函数里的代码。


 fn+f10或fn+f11或fn+f9搭配fn+f5都可以进入调试状态。进入调试状态后,就会激活窗口功能,就有以下的监视窗口:



 我们来讲一些有用的窗口,有以下几个:



 自动窗口它会根据执行流的位置,自动在窗口监视相应变量的值,我们不需要自己手动输入变量名去观察。不过它只要过了这个执行流,它先前监视的那些变量也会自动消失。


 局部窗口也是一样,观察执行的位置有那些局部变量,在窗口上显示,自动有,自动无,这两个不是很重要,最重要的是监视窗口。


 监视窗口是需要我们手动输入变量名,但它不会消失,会一直监视着,我们用的最多的就是监视窗口。


 内存窗口可以看内存的存储情况。调用堆栈窗口可以看出函数的调用关系。寄存器窗口监视的是寄存器。反汇编窗口可以进入到反汇编,看汇编代码。


 栈的特性:先使用高地址,再使用低地址。


四.好代码


 好代码的一些公认的标准:


代码运行正常;

bug很少(有些bug是隐晦的,避免不了,尽量不要有bug);

效率高;

可读性高;

可维护性高;

注释清晰

有一些帮助文档帮助理解;

 怎么写出好代码:


使用assert(断言),确保不会出现我们最不期望的情况出现

使用const关键字保护我们期望不要被修改的内容被修改

添加注释,把写代码的逻辑写出来,方便自己也方便他人

 assert(exp1); assert的头文件是<assert.h>,如果exp1的表达式为真,那assert什么事情都不会做,如果表达式为假,就会报错,让程序跑不起来,并且很好的一点是,它会告诉你是在哪一个地方出错了。


4.1const修饰指针的两种位置

 我们先看一种情况:


 这里a被const修饰了,也就是说我们不期望a的内容被改变。确实,不能直接通过a改变,但可以用指向a的指针去改变,这就有点像障眼法一样,用另一种巧妙的方式改变了a的值。当然编译器也会报警告。



 那该怎么做才能让指针改变不了a呢?在*的左边加上const修饰就可以了。



 只要是在星号的左边放着,意思是:const修饰的是*p,*p不能被改变,也就是p不能通过解引用改变它所指向的空间里的内容。


 第二种情况是const放在*的右边,这样就会使pa不能更改。


五.错误分类


 使用编译器跑代码的时候,会出现三种错误:


 编译型错误:一般是代码出现语法错误,这种情况很好解决,在编译器的报错栏里左键双击可以快速定位到行数,修改后即可。


 链接型错误:一般是程序找不到对应的变量名或函数名,也有可能是头文件没包含报的错,我们需要注意不要使用未定义的函数、变量,也有可能是在打字的时候多了后少了,大小写混了。


 运行时错误:以上两种情况都比较好处理,最难处理的属于运行错误了,表现为代码跑的起来,但结果是错误的,这时解决的方法有两种:第一种是脑袋里过程序的执行逻辑,第二种就是调试找bug。单纯仅凭直觉是不够的,除非已经见过太多的bug了,可以凭直觉预支到是哪一部分出错了,再进行小范围内调试。


 好啦,以上就是C语言的基础啦,后面就讲更深层次的C语言知识了。对了,博主由于一次测试,被编程题折磨到了,痛定思痛,转向最弱的编程题进军,以后更多的是题目的更新,希望大家能够喜欢。


 小透露:博主的编程能力是真的差,差到那种,一些就都是bug的那种,最弱的地方最致命,痛苦。


结语:希望读者读完有所收获!在学C的路上,祝福我们能越来越C!✔


 读者对本文不理解的地方,或是发现文章在内容上有误等,请在下方评论区留言告诉博主哟~,也可以对博主提出一些文章改进的建议,感激不尽!最后的最后!


 ❤求点赞,求关注,你的点赞是我更新的动力,一起努力进步吧。

相关文章
|
6月前
|
程序员 C语言
C语言--调试技巧(下)
C语言--调试技巧(下)
|
8月前
|
存储 编译器 C语言
C语言知识之结构体及实用调试技巧(二)
C语言知识之结构体及实用调试技巧(二)
55 0
|
6月前
|
程序员 C语言
C语言--调试技巧(上)
C语言--调试技巧(上)
|
8月前
|
供应链 C语言
【结构体】C语言结构体使用教程
【结构体】C语言结构体使用教程
69 0
|
8月前
|
C语言
C语言知识之结构体及实用调试技巧(一)
C语言知识之结构体及实用调试技巧
42 0
|
8月前
|
程序员 C语言 C++
c语言学习之调试技巧
c语言学习之调试技巧
96 0
|
8月前
|
编译器 程序员 C语言
初识C语言 ----> 调试篇(1)
大家平时写代码是不是这样的:看完题目,好,咔咔开始写,没有什么思路,好不容易写完了,一运行,嘎嘎报错,咦?这里错了?,改!运行,哎?又错了? 最后连蒙带猜,带着疑问运行成功了,这样的习惯不太好,所以调试就显得很重要。
31 0
|
10月前
|
程序员 C语言 C++
结构体入门&调试技巧(一)
结构体入门&调试技巧(一)
|
10月前
|
程序员 C语言
|
10月前
|
程序员 编译器 C语言