c语言-实用调试技巧

什么是bug?

程序中出现的问题

调试是什么?有多重要?

测试的基本步骤:发现程序错误的存在 以隔离、消除等方式对错误进行定位,确定错误产生的原因,提出纠正错误的解决办法,对程序错误予以改正,重新测试

debug和release的介绍

debug通常称为调试版本,他包含调试信息,并且不做任何优化,便于程序员调试程序

release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。

windows环境调试介绍

一些调试的实例    

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

使用断言:

//模拟实现库函数 strcpy
//拷贝字符串//函数返回的是目标空间的起始地址
char* my_strcpy(char* dest,const char* src)
{char* ret = dest;//断言assert(dest != NULL);    //使用assert需要使用#include <assert.h>assert(src != NULL); //while (*src != '\0')// while (*dest = *src) //   \0时 ascll为0,while判断为false// {//     //*dest = *src;//     dest++;//     src++;// }while (*dest++ = *src++){;  //空语句}return ret;}
int main()
{char arr1[] = "fanfan";char arr2[20] = {0};//char* p = NULL;//my_strcpy(p,arr1);//my_strcpy(arr2,arr1);//printf("%s\n",arr2);//printf("%s\n",strcpy(arr2,arr1));printf("%s\n",my_strcpy(arr2,arr1));return 0;
}// int main()
// {
//     // int num = 10;
//     // num = 20;
//     // int* p = &num;
//     // *p = 200;//     const n = 100;
//     //n = 200; //err
//     int* p = &n;
//     *p = 20;
//     printf("%d\n",n);//     return 0;
// }// int main()
// {
//     int m = 10;
//     //const不仅可以修饰变量也可以修饰指针
//     int n = 100;
//     const int* p = &m;
//     //*p = 0;
//     p = &n;  //
//     printf("%d\n",m);//     return 0;
// }//const修饰指针的时候
//当const放在*的左边的时候,限制的是指针指向的内容,不能通过指针改变指针指向的内容,但是指针变量的本身是可以改变的
//当const放在*的右边的时候,限制的是指针变量本身,指针变量的本身是不能改变的,但是指针指向的内容是可以通过指针来改变的
int main()
{int m = 10;//const不仅可以修饰变量也可以修饰指针int n = 100;//const int* p = &m;//int* const p = &m;const int*  p = &m;*p = 0;p = &n;  //printf("%d\n",m);return 0;
}//模拟实现一个strlen函数int my_strlen(const char* str)
{assert(str);  //断言判断是不是空指针int count = 0;while ( *str != '\0'){str++;count++;}return count;}int main()
{char arr[] = "abcde";int len = my_strlen(arr);printf("%d\n",len);return 0;
}

编程常见的错误

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

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

运行时错误:借助调试,逐步定位问题,最难搞

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

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

相关文章

云原生之使用Docker部署RSS阅读器Huntly

云原生之使用Docker部署RSS阅读器Huntly 一、Huntly介绍1.1 Huntly简介1.2 Huntly功能2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Huntly镜像五、部署Huntly5.1 创建挂载目录5.2 创建Hun…

气导耳机是什么样的?盘点五款好用的气传导耳机分享

​气传导耳机在运动、户外、办公等场景中具有独特的优势。然而&#xff0c;面对市场上琳琅满目的气传导耳机产品&#xff0c;很多用户不知如何下手。接下来&#xff0c;我将推荐市面上热销火爆&#xff0c;并性能出色、性价比高的气传导耳机给大家&#xff0c;希望大家都能选到…

OkGo - 一个基于okhttp的标准RESTful风格的网络框架

官网 GitHub - jeasonlzy/okhttp-OkGo: OkGo - 3.0 震撼来袭&#xff0c;该库是基于 Http 协议&#xff0c;封装了 OkHttp 的网络请求框架&#xff0c;比 Retrofit 更简单易用&#xff0c;支持 RxJava&#xff0c;RxJava2&#xff0c;支持自定义缓存&#xff0c;支持批量断点下…

GMAC接口(5)——LWIP移植

1.LWIP源码下载 官网&#xff1a;https://savannah.nongnu.org/projects/lwip/ 版本&#xff1a;lwip-2.2.0 2.移植 2.1LWIP目录 2.1.1.porttable目录 2.1.1.1.cc.h #ifndef CC_H_ #define CC_H_#define SYS_ARCH_DECL_PROTECT(lev) #define SYS_ARCH_PROTECT(lev) #def…

C++常见面试题汇总

C++常见面试题汇总: C++中的指针和引用有什么区别?什么是C++中的多态?如何实现?C++中的析构函数有什么作用?什么是构造函数链?C++中如何进行内存管理?什么是作用域?C++中的作用域限定符有哪些?什么是预处理指令?C++中常见的预处理指令有哪些?什么是头文件?头文件中…

01-Scala环境部署

Scala简介 Scala即Scalable Language单词的缩写&#xff0c;表示可伸缩语言的意思。 Scala语言是基于Java开发的&#xff0c;所以其编译后的文件也是字节码文件&#xff0c;并可以运行在JVM中 Scala与Java的关系 ​ Martin Odersky是狂热的编译器爱好者&#xff0c;长时间的…

面试必杀技:Jmeter性能测试攻略大全(第三弹)(脚本开发)

今天是最后一章哦&#xff0c;主要是讲jmeter性能测试脚本相关的。原创不易&#xff0c;点个赞意思一下呗&#xff01; 一. 脚本开发方式大纲 1、badboy进行录制和导出 badboy下载地址: 链接&#xff1a;https://pan.baidu.com/s/18Po3RssrBRSnn_-xsHop1g 提取码&#xff1…

spring博客实现分页查询

1、首先创建dto下的分页类PageBean package com.zzz.blog.dto;import java.util.List;public class PageBean {private Integer pageSize; //页面大小private Integer currentPage; //当前页private Integer totalCount; //总条数private Integer totalPage; //总页数private …

Linux计划任务

at 参数 日期时间&#xff1a;指定任务执行的日期时间。 在指定时间执行一个任务 -f&#xff1a;指定包含具体指令的任务文件&#xff1b; -q&#xff1a;指定新任务的队列名称&#xff1b; -l&#xff1a;显示待执行任务的列表&#xff1b; -d&#xff1a;删除指定的待执行…

Simulink 封装

快捷键&#xff1a; Edit Mask&#xff1a;CtrlM Look Under Mask&#xff1a;CtrlU 封装之后的模型&#xff1a; Edit Mask界面&#xff1a; 双击模块后的提示界面&#xff1a; 封装的模块内部&#xff1a;

自动驾驶领域中的CMS系统应用探讨

由佐思汽研主办的“ ICVS汽车智能网联大会”正式启幕&#xff0c;邀请Tier1、软件供应商、操作系统商、智能驾驶及智能驾舱相关企业&#xff0c;共同探讨行业现状、创新技术应用交流、以及未来行业发展趋势等。 赛格导航视频产品线总监刘玉龙应邀参加本次大会&#xff0c;并发…

【响应式布局】

响应式布局 1 什么是响应式布局2 响应式布局的5种实现方案2.1 百分比布局2.2 媒体查询布局2.3 rem响应式布局2.4 vw / vh响应式布局2.5 flex弹性布局 1 什么是响应式布局 响应式布局就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。这个概念是为解决移动互…

Leetcode.2522 将字符串分割成值不超过 K 的子字符串

题目链接 Leetcode.2522 将字符串分割成值不超过 K 的子字符串 rating : 1605 题目描述 给你一个字符串 s s s &#xff0c;它每一位都是 1 1 1 到 9 9 9 之间的数字组成&#xff0c;同时给你一个整数 k k k 。 如果一个字符串 s s s 的分割满足以下条件&#xff0c;我们…

非常有用的JavaScript高阶面试技巧!

&#x1f340;一、闭包 闭包是指函数中定义的函数&#xff0c;它可以访问外部函数的变量。闭包可以用来创建私有变量和方法&#xff0c;从而保护代码不受外界干扰。 // 例1 function outerFunction() {const privateVariable "私有变量";function innerFunction()…

群狼调研(长沙学校满意度调查)开展长沙游客满意度调查

长沙&#xff0c;作为湖南省的省会&#xff0c;是一座具有悠久历史和丰富文化底蕴的城市。近年来&#xff0c;随着旅游业的快速发展&#xff0c;越来越多的游客选择来长沙旅游观光。为了了解游客的需求和期望&#xff0c;提高游客的满意度&#xff0c;进行长沙游客满意度调查显…

完全背包 动态规划 + 一维dp数组

动态规划&#xff1a;完全背包理论基础 每件商品都有无限个&#xff01;&#xff01;&#xff01; &#xff08;1&#xff09;0-1背包的核心代码 解决0-1背包问题&#xff08;方案二&#xff09;&#xff1a;一维dp数组&#xff08;滚动数组&#xff09;_呵呵哒(&#xffe3;…

【.net core】使用nssm发布WEB项目

nssm下载地址&#xff1a;NSSM - the Non-Sucking Service Manager 配置方式 修改服务在nssm工具下输入命令:nssm edit jntyjr 其中 jntyjr为添加服务时设置的Service name nssm可以设置任何以参数启动的应用程序以服务形式启动,通过设置参数内容启动服务 以上配置等同于执行…

14:00面试,14:06就出来了,这问的谁顶得住啊

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

在比特币上使用可检索性证明支付存储费用

我们为用户开发了一种为云存储付费的新方法。 与亚马逊的 S3 等传统云存储相比&#xff0c;用户不必信任服务器。 我们使用比特币智能合约来确保支付取决于服务器的可检索性证明 (PoR)&#xff0c;该证明只能在数据仍然可用且需要时可以检索的情况下生成。 可检索性证明 (PoR)…

国际播客日 · 森海塞尔精选播客设备满足各类音频需求

森海塞尔精选播客设备 为庆祝今年的国际播客日,森海塞尔带来一系列适合各类需求和预算的出色音频解决方案 9月30日被定为国际播客日,至今已有九年的时间了。作为庆祝播客力量的全球性节日,国际播客日备受播客听众和创作者喜爱。播客的选择琳琅满目,从真实犯罪案件、阴谋论和名…