1.调试的基本
调试是发现并解决C语言编译的bug的方法。
调试基本步骤是1.发现程序错误的存在 2.以隔离、消除等方式对错误进行定位 3.确定错误产生的原因 4.提出纠正错误的解决办法 5.对程序错误予以改正,重新测试
编译版本release和debug版本,release比较debug版本文件大小更加小和优化更加好是对用户发布的版本;debug是程序员的调试版本,对于程序员更加容易去检查和调试
vs编译器的调试快捷键
F10开始调试
F11进行单条语句(较F10调试更加详细)大多用于进入函数
F9用于设置断点
F5进行运行到断点上
Ctrl+F5开始运行代码
建议一个网站VS中常用的快捷键_vs快捷键-CSDN博客
查看程序的具体信息,先进入调试
上面不同的箭头代表了不同窗口
自动窗口时自动监视变量的值,全自动有可能会将不想要的值监视而会让想要监视的值取消
监视需要手动监视变量的值
调用栈堆可以看到函数之间的调用关系
内存输入地址后就将显示地址对应的内容进行表现出来
反汇编就是转到定义查看具体运行情况
总结:纸上得来终觉浅,绝知此事要躬行。实践是检验真理的唯一标准,只有我们在实践中不断的调试,我们才能运用调试解决一些真正的问题
2.编程的常见问题
(1)编译性错误
常见的语法错误,用编译器就能轻松识别
(2)链接性错误
编译器找不到未定义的函数或者是未声明的变量,编译器在编译时可以轻松识别。
(3)运行时错误
在运行时发生错误,编译器无法识别,程序员就要使用调试进行解决。
3.减少错误发生的技巧
(1) 使用assert
assert就是断言,如果assert库函数判断不通过就不执行下面代码,例如:
(2)尽量使用const
const修饰变量可以将他们无法修改,将一些变量拥有常量属性可以将变量防止修改,而对于指针变量进行const修饰,如果在*前面就是对指针指向的空间无法用指针修改,在*后面就是对指针无法修改;很容易理解*前面就是对变量指向的空间进行限定,后面就是对指针进行限定。如下图
(3)养成良好的编码风格
(4) 添加必要的注释
(5) 避免编码的陷阱
4.练习
cs
int main()
{
int i = 0;
int arr[10] = {0};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("%d ",i);
}
return 0;
}
上面这个代码有越界访问,这个代码在VS编译时会进入死循环
由于在C语言在定义变量时会从高地址向低地址进行使用空间,在i变量和数组之间还有几个未利用的空间,数组地址是从高到低进行的这样越界时就有可能越界到i中,从而使i的值被修改,造成死循环。
编写my_strcopy的代码