目录
1.什么是bug
发现bug的顺序:程序员、测试 / 测试开发(测试程序的正确性、软件测试人员)、用户
2.调试 Debug
在项目文件夹下(test):
- Debug调试版本:包含调试信息、便于调试、文件大
- Release发布版本:对代码进行了优化、不能调试、软件测试人员测试的版本、大小和速度优化、文件小
快捷键:
- F9:设置断点
- F5:跳到断点处、程序逻辑执行的下一个断点
- F10:会跳过函数等等
- F11:会进入函数等等
- shift+F11:会跳出函数
3. 调试解决死循环问题
- Ctrl+c:手动停止终端命令(可关闭C语言的死循环)
- 栈区:默认先使用高地址空间、再使用低地址空间
- 数组:随着下标的增加,地址是由低到高变化
解析:main函数内部创建了两个局部变量i和arr,局部变量是存放在栈上,因为栈空间默认的使用习惯是先使用高地址空间、再使用低地址空间。又因为随着下标的增加,地址是由低到高变化。所有,数组如何向后越界的话,可能会遇到i,会将i改变导致死循环
如果这题改成<=11,程序会因为越界访问而崩溃,<=12没有报错,因为程序忙着死循环,没有机会报错。或者将i和arr的创建调换位置也只会程序崩溃,不会死循环
for(int i = 0;;)//这是C++的写法,C没有这种规定,可能会在有的编译器上没法运行
不同版本的区别:
4.模拟实现strcpy
4.1 第一种(6分实现)
4.2 第二种(7分实现)
- 先拷贝,然后++
- '\0'的ascii码为0,拷贝完之后即为假,跳出
4.3 第三种(8分实现)
- 使用assert断言,需包含头文件assert.h
- assert(表达式)表达式为真,正常运行;表达式为假,会报错
4.4 第四种(10分实现)
- 使用const修饰
const int* p = &a; //修饰*p ,*p的内容不能修改,*p = 10(❌)
int* const p = &a; //修饰p,p的内容不能改变,p = &b或者p = NULL(❌)
5.编程常见的错误
1.编译型错误:语法错误
2.链接型错误:无法解析的外部符号就是一种链接错误
3.运行时错误:什么错误都没有,但是运行出来不正确