C语言技巧 ----------调试----------程序员必备技能

news2024/11/18 7:38:28

作者前言

 

🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂

   🎂      作者介绍:                              🎂🎂

       🎂 🎉🎉🎉🎉🎉🎉🎉              🎂

          🎂作者id:老秦包你会,         🎂

简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

             喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨         🎂🎂🎂🎂🎂🎂🎂🎂

                 🎂个人主页::小小页面🎂

                  🎂gitee页面:秦大大🎂

                   🎂🎂🎂🎂🎂🎂🎂🎂
        🎂  一个爱分享的小博主 欢迎小可爱们前来借鉴🎂

_______________________________________________________

______________________________________________________________________

目录

实用调试技巧

        什么是bug?

        调试是什么?有多重要?

        debug和release的介绍。

        windows环境调试介绍。

        如何写出好(易于调试)的代码。

        编程常见的错误。

-——————————————————————————————————

什么是bug

计算机硬件或者软件的错误

调试是什么?有多重要?

调试 (英语: Debugging / Debug ),又称除错,是发现和减少计算机程序或电子仪器设备中程序
错误的一个过程。
调试的基本步骤
1. 发现程序错误的存在
2. 以隔离、消除等方式对错误进行定位
3. 确定错误产生的原因
4. 提出纠正错误的解决办法
5. 对程序错误予以改正,重新测试

DebugRelease的介绍。

Debug 通常称为调试版本 ,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本 ,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优
的,以便用户很好地使用。
简单理解为Debug是程序员使用的,Release是用户使用的
下面我们使用代码分别利用这两个进行执行

 Debug:

Release:

 可以看到两者区别,这里简单的介绍一下这两个

Windows环境调试介绍

快捷键
F5
启动调试,经常用来直接跳到下一个断点处。
F9
创建断点和取消断点
断点 的重要作用,可以在程序的任意位置设置断点。
这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

 断点一般配合f5进行运行,跳到下一次断点(逻辑断点),

F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑 进入函数内部 (这是最
长用的)。
CTRL + F5
开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用

调试的时候查看程序当前信息

 上图是要调试之后才能查看

调用堆栈 

反应的是函数的调用逻辑,像栈一样后进先出,反应函数调用的顺序

多多动手,尝试调试,才能有进步。
一定要熟练掌握调试技巧。
初学者可能 80% 的时间在写代码, 20% 的时间在调试。但是一个程序员可能 20% 的时间在写
程序,但是 80% 的时间在调试。
我们所讲的都是一些简单的调试。
以后可能会出现很复杂调试场景:多线程程序的调试等。
多多使用快捷键,提升效率

地址的使用

1.栈区上内存使用的习惯是:从高地址向低地址使用(先使用高地址再使用低地址)

2.数组随着下标的增长,地址是由低到高变化的

如何写出好(易于调试)的代码

优秀的代码

1. 代码运行正常  2. bug很少  3. 效率高  4. 可读性高    5. 可维护性高    6. 注释清晰     7. 文档齐全
常见的 coding 技巧:
1. 使用 assert
2. 尽量使用 const
3. 养成良好的编码风格
4. 添加必要的注释
5. 避免编码的陷阱。
代码1:
#include<stdio.h>
#include<string.h>
#include<assert.h>
void copy(char arr1[], char arr2[], int sz)
{
	if (arr1 != NULL || arr2 != NULL)
	{
		return;
	}
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr1[i] = arr2[i];
	}
}
void copy2(char arr1[], char arr2[])
{

	assert(arr1 != NULL);
	assert(arr2 != NULL);
	int i = 0;
	int j = 0;
	while (arr1[i++] = arr2[j++])
	{
		;
	}
}
int main()
{
	char arr1[] = "123456789";
	char arr2[] = "abcdefg";
	//strcpy(arr1, arr2);
	int sz = sizeof arr2 / sizeof(char);
	//copy(arr1, arr2, sz);
	copy2(NULL, arr2);
	printf("%s", arr1);
	return 0;
}

这里使用了assert.h头文件中的assert(表达式),表达式为假就会报错

计算表达式,当结果为FALSE时,打印诊断消息并中止程序。

const修饰变量的时候,是在语法层面限制了变量修改,但本质上变量不是常量,是一种不能修改的变量,但是有一种情况,就是通过指针修改

#include<stdio.h>
int main()
{
	const int num = 120;
	int* p = &num;
	*p = 10;
	printf("%d", num);
	return 0;
}

本来const修饰指针变量,使变量不能修改,但是通过指针就能修改,这个不符合我们的预想的

如果const修饰指针变量的就会有两种写法

1. const 放在* 左边

int const*  p = &num; 这种写法也可以

 可以看出当const放在*前面修饰。修饰的是*p,使*p不能修改

2. const 放在* 右边

 可以看出当const 放在* 的后面限制的是p,使p不能修改

编程常见的错误

编译型错误

直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

链接型错误

看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是 标识符名不
存在 或者 拼写错误

运行时错误

 借助调试,逐步定位问题。最难搞

有时我们要注意一下是否是未导入头文件,调用函数的函数名有误 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch中torch.einsum函数的详细计算过程图解

第一次见到 rel_h torch.einsum(“bhwc,hkc->bhwk”, r_q, Rh)这行代码时&#xff0c;属实是懵了&#xff0c;网上找了很多博主的介绍&#xff0c;但都没有详细的说明函数内部的计算过程&#xff0c;看得我是一头雾水&#xff0c;只知道计算结果的维度是如何变化的&#xf…

IDEA使用数据库(新手入门详细教程)

第一步:将数据库服务器打开 进入你下载好的数据库路径到bin目录下cmd打开命令提示符界面 确认启动数据库 第二步&#xff1a;打开IDEA&#xff0c;找到IDEA数据库 第三步&#xff1a;选择要连接数据库 第四步&#xff1a;根据数据库信息连接数据库 连接之前的页面 输入我们要的…

常温超导:AI在研发中的潜力

目录 引言&#xff1a;1. 常温超导的挑战&#xff1a;2. AI在材料研究中的作用&#xff1a;3. AI在理论模型中的作用&#xff1a;4. AI与实验室合作的潜力&#xff1a;结论&#xff1a; 引言&#xff1a; 常温超导一直被认为是科学界的“圣杯”&#xff0c;可以在室温条件下实…

谷歌seo推广怎么做

谷歌SEO&#xff08;搜索引擎优化&#xff09;推广是提高网站在谷歌搜索结果中的排名&#xff0c;从而获得更多有针对性的流量和潜在客户的过程。以下是一些关键步骤&#xff0c;帮助您进行谷歌SEO推广&#xff1a; 关键词研究&#xff1a;首先&#xff0c;进行详细的关键词研究…

公司植物日常护养方法备忘录

植物为我们净化空气&#xff0c;美化环境&#xff0c;我们要按照科学的经验照顾好它们。公司植物日常通用护养方法如下&#xff1a; 首先剪掉已经枯黄的部分。 需要晒太阳的植物按时搬到外面晒太阳&#xff0c;每次晒1到2个小时。 所有植物统一在每个月的20号左右施肥一次&am…

链表(二) 双链表操作详解

文章目录 四、双向带头循环链表的实现List.hList.c创建返回链表的头结点双向链表打印双向链表尾插双向链表尾删双向链表头插双向链表头删双向链表查找双向链表在pos的前面进行插入双向链表删除pos位置的节点 五、单链表与双链表比较 什么是链表及单链表的实现请跳转&#xff1a…

JS监听页面回退前进的方案

您好&#xff0c;如果喜欢我的文章&#xff0c;可以关注我的公众号「量子前端」&#xff0c;将不定期关注推送前端好文~ 前言 在业务中遇到需求&#xff0c;App中的H5页面跳转到其他外链页面&#xff0c;外链页面修改了整个APP中的导航栏样式&#xff0c;回退到当前页面&…

微信开发之自动回复的技术实现

请求URL&#xff1a; http://域名地址/sendText 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是string登录实例标识wcId是string接收…

人物宣传稿怎么写?写作技巧有哪些?

人物宣传稿是一种介绍个人或组织成员的文案&#xff0c;旨在宣传其成就、特点和影响力。以下是一些人物宣传稿的写作技巧&#xff0c;帮助您撰写出生动、引人入胜的宣传稿。接下来伯乐网络传媒就来给大家讲解一下。 突出核心信息&#xff1a; 在宣传稿的开头&#xff0c;用简洁…

ARTS 挑战打卡的第1天,我学到了这些~

关于 ARTS 的释义 —— 每周完成一个 ARTS&#xff1a; ● Algorithm: 每周至少做一个 LeetCode 的算法题 ●Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: 分享一篇有观点和思考的技术文章 深度学习 深度学习概念崛起框架 主页传送门&…

在线思维导图怎么绘制?学学这几种绘制方法

在线思维导图怎么绘制&#xff1f;思维导图是一种非常有效的学习和工作工具&#xff0c;可以帮助我们更好地组织和呈现信息&#xff0c;提高学习效率和工作效率。而在线思维导图的出现&#xff0c;更是为我们的绘制带来了极大的便利。现在也有很多绘制思维导图的方法&#xff0…

【RedisInsight】连入Docker容器可视化redis服务

文章目录 下载安装RedisInsight添加数据库添加docker容器内的redis数据库 下载安装RedisInsight 进入redis官网下载&#xff1a;https://redis.com/redis-enterprise/redis-insight/&#xff0c;安装过程一路Next即可。 打开桌面上的快捷方式启动&#xff1a;RedisInsight-v2…

windows创建占用特定端口程序

默认情况下&#xff0c;远程桌面使用的是3389端口。如果您想将远程桌面端口更改为8005&#xff0c;以达到模拟程序占用端口8005的情况&#xff0c;可以执行以下操作&#xff1a; 如执行以下命令&#xff0c;则1&#xff0c;2&#xff0c;3步相同操作可以跳过&#xff0c;直接往…

C++ 好用的日志库--spdlog

背景 spdlog 是一个快速、异步的、header-only 的 C 日志库。它提供了简单易用的 API 并具有高性能和可扩展性。 下载和使用 下载 spdlog 库下载地址&#xff1a;github 链接 hello world 在使用时只需要 include 整个 /include/spdlog 文件夹即可。 #include "spd…

【excel技巧】进阶版:excel文件批量提取文件名

前面给大家分享了简单的excel提取文件名方法&#xff0c;今天继续分享&#xff0c;进阶版excel文件批量提取文件名的方法。 点击excel工具栏中的【数据】功能&#xff0c;点击获取数据 – 来自文件 – 从文件夹 然后找到需要提取文件名的文件夹&#xff0c;点击打开&#xff0…

直线导轨使用中常见的问题有哪些?

直线导轨作为设备的核心部件之一&#xff0c;起着导向和支撑的作用功能。目前&#xff0c;已被广泛应用在各行各业中&#xff0c;大到机械设备&#xff0c;小到抽屉&#xff0c;我们都能看到直线导轨的身影&#xff0c;可以说&#xff0c;直线导轨已经悄无声息的进入到我们的生…

OC与Swift的相互调用

OC调用Swift方法 1、在 Build Settings 搜索 Packaging &#xff0c;设置 Defines Module 为 YES 2、新建 LottieBridge.swift 文件&#xff0c;自动生成桥 ProductName-Bridging-Header.h 3、在 LottieBridge.swift 中&#xff0c;定义Swift类继承于OC类&#xff0c;声明 obj…

站点可靠性工程 (SRE)

随着世界各地的组织努力开发安全、可靠、可扩展且可持续的 IT 基础架构&#xff0c;对高效基础架构监控和管理的需求日益增长&#xff0c;企业正在用不可扩展的遗留架构换取现代解决方案&#xff0c;在尖端技术的推动下&#xff0c;这些使基础设施管理过程更加顺畅和轻松&#…

Django学习笔记-默认的用户认证系统(auth)

一、Django默认的用户认证系统 Django 自带一个用户验证系统。它负责处理用户账号、组、权限和基于cookie的用户会话。 Django 验证系统处理验证和授权。简单来说&#xff0c;验证检验用户是否是他们的用户&#xff0c;授权决定已验证用户能做什么。这里的术语验证用于指代这…

【云原生】K8S二进制搭建一

目录 一、环境部署1.1操作系统初始化 二、部署etcd集群2.1 准备签发证书环境在 master01 节点上操作在 node01与02 节点上操作 三、部署docker引擎四、部署 Master 组件4.1在 master01 节点上操 五、部署Worker Node组件 一、环境部署 集群IP组件k8s集群master01192.168.243.1…