C语言调试

news2024/11/15 11:29:52

目录

一.Debug和Release介绍

二.Windows环境调试介绍

三.窗口介绍

(1)自动窗口和局部变量窗口

(2)监视窗口

(3)调用堆栈

(4)查看汇编信息

(5)查看寄存器 

四.优秀的代码

五.练习实现strlen功能


一.Debug和Release介绍

Debug称为调试版本,包含调试信息,并且不作任何优化,便于程序员调试程序

Release称为发布版本,往往进行了各种优化,使得代码大小和运行速度上都是最优的,一边用户的使用,没有调试信息,得到的.exe文件大小比较小

直接就会将10个数打印出来

二.Windows环境调试介绍

ctrl+F5:编译-链接+生成可执行程序

按下F5后会一直执行程直到程序运行结束,通常与F9配合使用,进行调试

设置断点,不能跳过scanf(),必须进行完互动才可以跳到断点

注:

调试过程中尽量不要返回到上一步,因为结果会不准确

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

三.窗口介绍

(1)自动窗口和局部变量窗口

自动窗口只会显示一个函数内部的变量,跳到下一个函数,上一个函数内部的变量就消失了

 局部变量窗口也会有局部变量上下跳动,观察不方便

(2)监视窗口

输入什么就查看什么

注:

对于数组的查看

当在主函数时,可以输入数组名对全部元素进行查看

当进行传址调用时,输入数组名就只能查看第一个元素,但可以在数组名后加逗号再加数字, 进行多个元素的查看

(3)调用堆栈

(4)查看汇编信息

(5)查看寄存器 

可以在寄存器和监视窗口查看寄存器

调试演示

研究该代码死循环的原因

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("明日小路");
	}

	return 0;
}

编译器一直在执行循环,可能并不会进行越界访问的报错 

但如果将定义的i变量放在数组后面进行定义,就可以避免死循环

四.优秀的代码

release版本会将assert()优化掉

const 关键字可以对指针进行相关的修饰

下面对于strcpy代码进行自定义和优化

#include <string.h>
void my_strcpy(char* dest, char* sour)
{
	while (*sour != '\0')
	{
		*dest = *sour;
		dest++;
		sour++;
	}
	*dest = *sour;
}
int main()
{
	char arr1[20] = "XXXXXXXXXXXXXXXXX";
	char arr2[] = "Komichi Akebi";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

优化后

#include <string.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* sour)//加const 可以有效避免使用函数时将源字符和目标空间弄混
{
	char* ret = dest;

	assert(sour != NULL);
	assert(dest != NULL);
	while (*dest++ = *sour++);
	return ret;//返回值是目标空间的首元素地址,目的是实现链式访问
}
int main()
{
	char arr1[20] = "XXXXXXXXXXXXXXXXX";
	char arr2[] = "Komichi Akebi";
	printf("%s", my_strcpy(arr1, arr2));//函数具有返回值可以直接进行打印,可以实现链式访问
将一个函数的返回值作为另一个函数的参数
	return 0;
}

注:

对于常变量const

1.const的放在*左边

但是p变量本身的值是可以进行修改的 

2.const放在*右边

3.当在*的左边和右边都放上const ,则指针所指向的变量和指针本身都不能进行修改了

五.练习实现strlen功能

#include <assert.h>
int my_strlen(const char* str)//加const还是为确保str防止进行修改
{
	int count = 0;//记得对变量进行初始化
	assert(str);//进行断言,防止传入NULL
	while (*str++)
	{
		count++;
	}
	return count;
}
int main()
{
	char arr1[] = "Komichi Akebi";//定义数组的格式要写对,数组名后记得写[ ]
	int len = my_strlen(arr1);
	printf("%d", len);
	return 0;
}

问题:

1.不能对空指针NULL进行解引用操作

2.主函数里面数组在定义的时候,不需要加const,对于在传址的时候将指针用const进行修饰,只是将主函数中定义的一个不够安全的数组变得更加安全

编程常见的一些错误

C语言编译器在编译时会对代码进行修改,如将函数名前面加上下划线

链接错误不会找到对应的错误位置去

 后期有兴趣可以深入学习git

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

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

相关文章

Java零基础 - 算术运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

Win11网络连接选项和蓝牙选项突然消失的解决办法

在设置或者开始栏里搜索“网络重置” 打开网络重置&#xff1a; 然后点击立即重置&#xff0c;之后按照系统提示操作即可

Mybatis总结--传参二

#叫做占位符 Mybatis是封装的JDBC 增强版 内部还是用的jdbc 每遇到一个#号 这里就会变为&#xff1f;占位符 一个#{}就是对应一个问号 一个占位符 用这个对象执行sql语句没有sql注入的风险 八、多个参数-使用Param 当 Dao 接口方法有多个参数&#xff0c;需要通过名称使…

猫头虎分享已解决Bug || 超时错误:TimeoutError: Request timed out after 30000ms.

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

进程1——进程与线程——day09

今天&#xff0c;主要讲一下进程的一些基本概念和一些接口 首先是进程的基本概念&#xff1a; 1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态…

51单片机项目(34)——基于51单片机和esp8266的智能农业检测系统

1.设计要求 可以检测农业大棚中的温度、湿度、气压、光照等信息&#xff0c;可以检测土壤湿度&#xff0c;可以判断当前有没有下雨&#xff0c;能够将相关数据显示在OLED屏幕上。同时&#xff0c;使用esp8266wifi模块&#xff0c;将上述所有信息发送到手机APP显示。当温度、湿度…

SQL-Labs46关order by注入姿势

君衍. 四十六关 ORDER BY数字型注入1、源码分析2、rand()盲注3、if语句盲注4、时间盲注5、报错注入6、Limit注入7、盲注脚本 四十六关 ORDER BY数字型注入 请求方式注入类型拼接方式GET报错、布尔盲注、延时盲注ORDER BY $id 我们直接可以从界面中得知传参的参数为SORT&#x…

可变参数、Collections类

一、可变参数 定义&#xff1a;是一种特殊的形参&#xff0c;定义在方法、构造器的形参列表里 格式&#xff1a;数据类型...参数名称 特点&#xff1a;可以不传数据&#xff0c;也可以传一个或者多个数据给它&#xff0c;也可以传一个数组 好处&#xff1a;可以灵活接收数据…

刷题日记-Day2- Leedcode-977. 有序数组的平方,209. 长度最小的子数组,59. 螺旋矩阵 II-Python实现

刷题日记Day2 977 有序数组的平方209. 长度最小的子数组59. 螺旋矩阵 II 977 有序数组的平方 链接&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组…

真Unity3D编辑器Editor二次开发

IMGUI Editor Label 改变颜色 分享一个很神奇的颜色 一开始这么写&#xff0c;以为不行的&#xff0c; private void OnGUI()(){GUILayout.Label("<colorred>name:</color>ffdasilufoi");//。。。。 } 结果这么写又好了&#xff0c; private GUIStyle m…

Vivado MIG ip核使用教程

Step 1 在ip catalog中搜索mig ip核并打开&#xff0c;检查硬件配置 Step 2 Step 3 选择对其他芯片类型的兼容性&#xff0c;若无此方面需求&#xff0c;可直接点击next Step 4 选择存储器类型 Step 5 配置DDR3芯片工作频率、用户时钟、mig ip核输入时钟、DDR3芯片类型…

数据结构-Queue队列

一,队列的简单认识 队列也是一种线性数据结构,与栈不同的是,它只能从一端添加元素,从另一端取出元素.定义了一端,另一端也就确定了. (当然还有一个特殊的双向队列LinkedList除外,它既可以从队首添加元素,也可以移除元素,队尾也是一样的,既可以添加元素,也可以移除元素) 二,队…

AI误导游戏——LLM的危险幻觉

在当今科技高速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为日常生活和工作中不可或缺的一部分。特别是大语言模型&#xff08;LLM&#xff09;如GPT-4等&#xff0c;它们的智能表现令人惊叹&#xff0c;广泛应用于文本生成、语言翻译、情感分析等多个领域…

【rust】9、reqwest 调用 http

文章目录 一、client1.1 post reqwest 实现的 http server 和 client 用 https://github.com/seanmonstar/reqwest cargo add reqwest -F json cargo add tokio -F full一、client 1.1 post async fn http_post<T: Serialize>(addr: String, body: T) -> Result<…

jQuery 基础、选择器和筛选器

【一】JQuery基础 【1】什么时Jquery &#xff08;1&#xff09;定义 jQuery是一个流行的JavaScript库&#xff0c;旨在简化JavaScript编程和处理HTML文档的任务。它提供了一组易于使用的功能和方法&#xff0c;可以加快开发速度并提高跨浏览器兼容性。一款轻量级的JS框架 …

【Java程序设计】【C00285】基于Springboot的游戏分享网站(有论文)

基于Springboot的游戏分享网站&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的游戏分享网站 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在网站首页可以查看首页、游戏…

element 季度选择器组件

效果图&#xff1a; 回传给父组件的值&#xff1a; 季度选择器组件代码&#xff1a; <template><el-form><el-form-item><markclass"mark"v-show"showSeason"click.stop"showSeason false"></mark><el-input…

web安全学习笔记【15】——信息打点(5)

信息打点-CDN绕过&业务部署&漏洞回链&接口探针&全网扫描&反向邮件 #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…

大数据之Flink优化

文章目录 导言&#xff1a;Flink调优概览第1章 资源配置调优1.1 内存设置1.1.1 TaskManager 内存模型1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源1.2.1 使用 DefaultResourceCalculator 策略1.2.2 使用 DominantResourceCalculator 策略1.2.3 使用DominantResourceCalculato…

RM电控讲义【HAL库篇】(二)

8080并口模式是一种常见的计算机接口模式&#xff0c;主要用于LCD&#xff08;液晶显示屏&#xff09;模块。 在8080并口模式中&#xff0c;通信端口包括多种信号线&#xff0c;用于实现数据的读写和控制功能。主要的信号线包括&#xff1a; CS&#xff08;片选信号&#xff…