当前位置: 首页 > news >正文

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.练习

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 周鸿祎回应将成三六零第一大股东:会和公司一起走下去
  • 学习硬件测试04:触摸按键+PWM 驱动蜂鸣器+数码管(P62~P67、P71、P72)
  • mysql介绍
  • 1、.Net UI框架:WPF - .Net宣传系列文章
  • 反转链表(LeetCode)
  • 重燃代码之光:在PyCharm中恢复自动高亮的秘籍
  • Linux系统中的高级内核模块调试技术
  • override的作用和好处
  • Yarn:一个快速、可靠且安全的JavaScript包管理工具
  • 日期类的习题
  • 2024华数杯C题解题思路、参考论文已出(无偿分享)~
  • [QT开发_音乐播放器项目笔记01]
  • PyFilesystem2 - Python 操作文件系统
  • Django中的模型小总结:
  • 双指针算法
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • ECS应用管理最佳实践
  • Java IO学习笔记一
  • Java到底能干嘛?
  • JS基础之数据类型、对象、原型、原型链、继承
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mysql优化
  • Ruby 2.x 源代码分析:扩展 概述
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 构建二叉树进行数值数组的去重及优化
  • 解析 Webpack中import、require、按需加载的执行过程
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 码农张的Bug人生 - 初来乍到
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 删除表内多余的重复数据
  • 跳前端坑前,先看看这个!!
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 我从编程教室毕业
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # include “ “ 和 # include < >两者的区别
  • #include
  • $(function(){})与(function($){....})(jQuery)的区别
  • (5)STL算法之复制
  • (6)添加vue-cookie
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (编译到47%失败)to be deleted
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (六)c52学习之旅-独立按键
  • (五十)第 7 章 图(有向图的十字链表存储)
  • .net dataexcel winform控件 更新 日志
  • .Net 垃圾回收机制原理(二)
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net6 webapi log4net完整配置使用流程
  • .NET分布式缓存Memcached从入门到实战
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET运行机制