c语言--实用调试技巧

news2025/1/10 1:32:24

1什么是bug

2调试是什么,有多重要?

3debug与release

4windows环境调试简绍

5一些调试的实例

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

7编程常见错误

1什么是bug

导致计算机出现问题就叫bug

2调试是什么,有多重要?

调试:发现和减少计算机程序和硬件仪器中程序错误的一个过程

调试的步骤

发现程序错误的存在

以隔离,消除等方法对错误定位

确定错误产生的原因

提出纠正错误的解决办法

对程序错误赋予改正,重新调试

3debug与release

debug是称为调试版本,包含调试信息,并且不做任何优化,便于调试

releas称为发布版本,进行各种优化,使程序在代码大小与运行速度上都是最优的,让用户很好的使用

文件对比debug39k,release9k

 4windows环境调试简绍

1环境准备要调到debug版本下

2快捷键简绍

F5:启动调试,直接到下一个断点

F9:创建断点或者取消断点,可以让程序在任意位置停下,继而一步一步走下去

CRTL F9:禁用断点

F10:逐步调试

F11:逐语句每次执行一个语句,还可以进入函数内部

CTRL F5:开始执行但不调试

在循环中还可以设用断点条件

5调试时查看程序当期信息

5.1自动窗口

将变量列出来,但是进入函数后前面的变量不在窗口内,不够发哪个不

5.2局部变量

自动列出局部变量,也是不够方便

5.3监视

想按察谁就观察谁

a,数

当函数与局部变量名一样怎么办?

5.4查看内存 

一行四列,一列代表一个字节,按二进制存入,通过十六进制显示 

5.7查看堆栈

5.8查看汇编信息 

5.9查看寄存器信息

调试实例

1求n的阶乘相加

#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);

	int i = 0, num1 = 1;
	int j = 0, sum = 0;
	for (j = 1; j <= n; j++)
	{
		for (i = 1; i <= j; i++)
		{
			num1 = num1 * i;
		}
		sum = sum + num1;
	}
	
	printf("%d\n", sum);
	return 0;
}

结果不对,该怎么调试查看

F10进入调试,然后窗口,监视加入变量,再逐过程查看,然后  发现在j=3时num1=12

反推是因为上一次num1=2没有重置导致后面多乘一个2

修改后

for (j = 1; j <= n; j++)
	{
		num1 = 1;
		for (i = 1; i <= j; i++)
		{
			num1 = num1 * i;
		}
		sum = sum + num1;
	}

实例2
为什么该代码执行之后是死循环(恰好在该VS环境下的一中可能)

#include<stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hh\n");
	}
	return 0;
}

 调试:

当进行到arr【12】时i变成0,又重复,对i与arr【12】取地址查看,发现地址一样,在同一块内存空间,

原因

在栈区域,习惯先使用高地址内存再到低区域延申

数组随着下标增长,地址是由低地址到高地址

只要空间处理合适,数组越界到i的空间去就会导致这种情况

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

6.1优秀的代码

1bug少

2可读性高

3效率高

4注释清楚

5文档齐全

6可维护性高

6.2常见的技巧

1使用assert

2const

3风格

4避免陷阱

//模拟实现strcpy
#include<stdio.h>
void my_strcpy(char* arr1, char* arr2);
int main()
{
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hellow bit";

	my_strcpy(arr1, arr2);
	printf(" %s\n",arr1);
	return 0;
}
void my_strcpy(char* arr1, char* arr2)
{
	//当遇到\0时停止
	while (*arr2!='\0')
	{
		//将arr2赋值给arr1
		*arr1 = *arr2;
		//再让他们增加一直到最后一位
		arr1++;
		arr2++;
	}
	//再打印\0
	*arr1 = *arr2;

}

进阶

void my_strcpy(char* arr1, char* arr2)
{
	//当遇到\0时停止
	while (*arr1++ = *arr2++);
}

进阶的进阶

//防止放反了
void my_strcpy(char* arr1,const char* arr2)
{
	//防止指针是空指针
	assert(arr1 != NULL);
	assert(arr2 != NULL);

	while (*arr1++ = *arr2++);
}

 关于const

const int a = 10;
	//a=20,此时不行,const让a只有可读属性

	//相当于关了门,打开窗
	int* pa = &a;
	*pa = 20;
//const*p说名不能通过*p去改变
	//*const不能通过&p去改变

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

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

相关文章

4.线性数据结构——1.vector弥补数组的缺陷及其底层逻辑

数组的缺陷 数组在定义时大小固定&#xff0c;不能改变如果要定义在main内部&#xff0c;数组大小不能超过一百万&#xff08;6个0&#xff09;&#xff0c;超过需要定义为全局变量 定义在main内部&#xff0c;数组创建在内存的栈中&#xff0c;作为局部变量&#xff0c;但栈的…

基于stm32与TJC3224T124_011串口屏的PID调参器(附完整工程)

电赛在即&#xff0c;每次比赛调PID都是一件比较繁琐的事。每次都要在程序中改完再烧录到板子上&#xff0c;特别耗时。正好最近发现实验室的一块串口屏比较好玩。 于是就做了这个调PID的东西。它可以通过串口直接修改PID的值&#xff0c;从而达到快速调PID的目的。下面我将完整…

c++初阶------c++代码模块

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

MATLAB 公共区域的点云合并(46)

MATLAB 公共区域的点云合并(46) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 点云配准后,或者公共区域存在多片点云对场景进行冗余过量表达时,我们需要将点云进行合并,Matlab点云工具中提供了这样的合并函数,通过指定网格步长,对初始点云进行过滤。 函数主要实…

[STL]priority_queue类及反向迭代器的模拟实现

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a; priority_queue类及反向迭代器 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 向着c&…

特征融合篇 | YOLOv8改进之将主干网络SPPF更换为SimSPPF / SPP-CSPC / SPPF-CSPC

前言:Hello大家好,我是小哥谈。SimSPPF是YOLOv6中提出的一种改进的空间金字塔池化方法,它是SPPF的升级版。SimSPPF通过在不同尺度上使用不同大小的池化核来提取特征,从而提高了检测器的性能。与SPPF相比,SimSPPF可以在不增加计算成本的情况下提高检测器的性能。本节课就教…

【软件设计师】原码反码补码移码

数值1数值-1原码0000000110000001反码0000000111111110补码0000000111111111移码1000000101111111 正数 00000001 负数 10000001 正数&#xff1a;原码、反码、补码一样 负数&#xff1a;反码是原码符号位不变&#xff0c;其他取反&#xff1b;补码是反码1 移码是补码首位取…

八、C#计数排序算法

简介 计数排序是一种非比较性的排序算法&#xff0c;适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数&#xff0c;然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。 创建一个长度为max-min1的数组count…

Ambari——编译——解决替换yarn 版本后 系mvn 打包找不到yarn 文件问题

您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 报错原因&#xff1a; [ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.4:yarn (yarn install) on project amb…

入驻抖音小店后这些设置必须打开! 非常重要!否则小店无法运行!

哈喽~我是电商月月 大家入驻完抖音小店后是不是就不管了&#xff0c;直接去选品&#xff1f; 我现在告诉你&#xff0c;直接选品后你会发现你的抖音小店根本运行不了&#xff01; 为什么&#xff1f;那是因为这些设置你没打开&#xff1a; 一抖音号绑定店铺官方账号 抖音小…

Covalent Network(CQT)的以太坊时光机:在 Rollup 时代确保长期数据可用性

以太坊正在经历一场向 “Rollup 时代” 的转型之旅&#xff0c;这一转型由以太坊改进提案 EIP-4844 推动。这标志着区块链技术的一个关键转折&#xff0c;采用了一种被称为“数据块&#xff08;blobs&#xff09;”的新型数据结构。为了与以太坊的扩容努力保持一致&#xff0c;…

面试笔记——Java集合篇

Java集合框架体系 重点&#xff1a;单列集合——ArrayList、LinkedList&#xff1b;双列集合——HashMap、ConcurrentHashMap。 List相关 数组&#xff08;Array&#xff09; 是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 数组获取其他元素&#xff1a; 为什…

【微服务】接口幂等性常用解决方案

一、前言 在微服务开发中&#xff0c;接口幂等性问题是一个常见却容易被忽视的问题&#xff0c;同时对于微服务架构设计来讲&#xff0c;好的幂等性设计方案可以让程序更好的应对一些高并发场景下的数据一致性问题。 二、幂等性介绍 2.1 什么是幂等性 通常我们说的幂等性&…

leetcode 714

leetcode 714 题目 例子 思路1 使用dp[n][2] 存储最佳利润值&#xff0c;动态规划的思路&#xff0c;重要的是转移方程。 代码1 class Solution { public: int maxProfit(vector& prices, int fee) { int n prices.size(); //dp[i][0] 前i天手里没有股票的最大利润 //…

Share-ChatGPT官网UI/文件上传/联网搜索/GPTS 一并同步

地址&#xff1a;Share-ChatGPT 文章目录 界面UI&#xff0c;GPTS&#xff0c;读论文&#xff0c;数据分析&#xff0c;写论文视频演示仓库地址 界面 支持多账号同时管理&#xff0c;合理利用资源&#xff1a; UI&#xff0c;GPTS&#xff0c;读论文&#xff0c;数据分析&a…

老家稳定月薪3000工作和互联网企业3万怎么选?

这是发生在身上的真事。其实刚回老家心里落差非常的大&#xff0c;老家也不需要信息安全非常专业的人才&#xff0c;最终因为各种综合原因选择了回老家&#xff0c;有父母的因素&#xff0c;有4年2次被优化的因素&#xff0c;有互联网行业35岁的因素等等。 我回老家发展很多人…

C语言(结构体,联合体,枚举的讲解)

这期我们来讲解结构体&#xff0c;联合体&#xff0c;以及枚举的讲解&#xff0c;首先我们从概念开始一步一步的了解。 1&#xff0c;结构体 1.1概念 C 语言中的结构体是一种用户自定义的数据类型&#xff0c;它允许你将不同类型的变量组合在一起&#xff0c;从而形成一个新…

集合(下)Map集合的使用

文章目录 前言一、Map接口二、Map接口的实现类 1.HashMap类2.TreeMap类总结 前言 Map集合没有继承Collection接口&#xff0c;不能像List集合和Set集合那样直接使用Collection接口的方法。Map集合其自身通过以key到value的映射关系实现的集合&#xff0c;也有相应的许多方法。类…

零基础机器学习(3)之机器学习的一般过程

文章目录 一、机器学习一般过程1.数据获取2.特征提取3.数据预处理①去除唯一属性②缺失值处理A. 均值插补法B. 同类均值插补法 ③重复值处理④异常值⑤数据定量化 4.数据标准化①min-max标准化&#xff08;归一化&#xff09;②z-score标准化&#xff08;规范化&#xff09; 5.…

[蓝桥杯 2023 省 A] 颜色平衡树:从零开始理解树上莫队 一颗颜色平衡树引发的惨案

十四是一名生物工程的学生&#xff0c;他已经7年没碰过信息学竞赛了&#xff0c;有一天他走在蓝桥上看见了一颗漂亮的颜色平衡树&#xff1a; [蓝桥杯 2023 省 A] 填空问题 - 洛谷 十四想用暴力解决问题&#xff0c;他想枚举每个节点&#xff0c;每个节点代表一棵树&#xff0…