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

相关推荐
祈安_3 天前
C语言内存函数
c语言·后端
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone5 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054965 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
czy87874755 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
遥遥江上月5 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237175 天前
C语言-数组练习进阶
c语言·开发语言·算法