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

相关推荐
fouryears_234172 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~2 小时前
C#---StopWatch类
开发语言·c#
lifallen3 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
cui__OaO5 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
鱼鱼说测试5 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
艾莉丝努力练剑6 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_026 小时前
【Java基础面试题】Java基础概念
java·开发语言
Cx330❀7 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
杜子不疼.7 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习