C语言初阶(12)

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的代码

相关推荐
逊嘘2 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
xinghuitunan2 分钟前
蓝桥杯顺子日期(填空题)
c语言·蓝桥杯
Half-up5 分钟前
C语言心型代码解析
c语言·开发语言
Source.Liu26 分钟前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng27 分钟前
【Rust中的迭代器】
开发语言·后端·rust
余衫马30 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng33 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
Jacob程序员35 分钟前
java导出word文件(手绘)
java·开发语言·word
懒大王就是我41 分钟前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
小白学大数据42 分钟前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin