VS调试、debug和release、栈区底层简单介绍、const 修饰指针变量介绍

news2025/1/19 17:22:28

文章目录

  • 前言
  • 一、调试
  • 二、debug和release
  • 三、调试需要多用,多熟悉
  • 四、栈区底层简单介绍
  • 五、优秀的代码:
    • 常见的coding技巧:
  • 六、const 修饰指针变量
    • 1. const 出现在 * 左边
    • 2. const 出现在 * 右边
  • 七、strcpy函数的仿写
    • 1.版本1
    • 2. 版本2
    • 3. 版本3
    • 4. 版本4
  • 总结


前言

VS调试、debug,release、栈区底层简单介绍,好的代码,以及const修饰指针变量以及strcpy函数的仿写

一、调试

调试的快捷键

  1. F5 启动调试,经常用来直接跳转到断点。
  2. F9 创建和取消断点。
  3. F10 一次执行一个过程,比如一个语句,一次函数的调用
  4. F11 一次执行一句话,会进入函数内部执行语句

二、debug和release

  • debug 通常是指调试版本。
  • release 通常是发布版本,无法调试。

三、调试需要多用,多熟悉

  • 调试很重要
  • 据说,初学者80%写程序,20%调试(修bug),程序员20%写程序,80%调试.

四、栈区底层简单介绍

  • 先看一个例子
  • 这是在VS2019环境下的代码
  • 此代码的结果是死循环,重复打印“hehe”。
#include <stdio.h>

int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	for (i = 1; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hehe\n");
	}
	// i 与 arr 都是局部数据,都会放到栈区
	// 栈区的使用习惯是先高地址,再低地址
	// 所以,i 是 高地址, arr 是低地址
	// 但是 arr 数组的下标是由低地址到高地址
	// 所以给一定情况的越界,会导致 arr 和 i 的是同一个地址
	// 所以 i 会不断地重置为0 ,会陷入死循环。

	return 0;
}
  • 内存分为 栈区,堆区,静态区
    1. 栈区内存的使用习惯是,先使用高地址空间,再使用低地址处的空间。
    1. 数组随着下标的增长地址是由低到高变化的。
    1. 如果i 和 arr之间由适当的空间,利用数组的越界操作就可能会覆盖到i,就可能会导致死循环出现的。

在这里插入图片描述

五、优秀的代码:

  1. 代码运行正常
  2. bug少
  3. 效率高
  4. 可读性高
  5. 可维护性高
  6. 注释清晰
  7. 文档齐全

常见的coding技巧:

  1. 使用assert
  2. 尽量使用const
  3. 养成良好的编码风格
  4. 添加必要的注释
  5. 避免编码的陷阱

六、const 修饰指针变量

1. const 出现在 * 左边

 int main()
 {
 	int a = 0;
 	int n = 0;
 	const int* p = &a;
 	//*p = 0; // err
 	p = &n; // right
	reutrn 0;
}
  • 如上代码
  • const 出现在 * 左边,表示指针变量p所指向的对象能通过变量p被修改。
  • 但是,指针变量p可以重新取地址,不可以被修改。

2. const 出现在 * 右边

 int main()
 {
 	int a = 0;
 	int n = 0;
 	int* const p = &a;
 	*p = 0; // right
 	//p = &n; // err
	reutrn 0;
}
  • 如上代码
  • const 出现在 * 右边,表示指针变量p所指向的对象可以通过变量p被修改。
  • 但是,指针变量p可以重新取地址,可以被修改。

七、strcpy函数的仿写

  • strcpy库函数是会把字符串的**\0字符**也拷贝上的。

1.版本1

#include <stdio.h>
//  strcpy函数的仿写
void my_strcpy(char* dect, char* ret)
{
	while (*ret != '\0')// ret中若找到\0则跳出循环,此时*ret已经时\0,再次赋值就可以将\0也拷贝到dect中
	{
		*dect = *ret;
		dect++;
		ret++;
	}
	*dect = *ret;
}

int main()
{
	char arr1[20] = "XXXXXXXXXXXXXX";
	char arr2[] =   "hello bit";

	my_strcpy(arr1, arr2);

	printf("%s", arr1);
 
	return 0;
}

2. 版本2

#include <stdio.h>
//  strcpy函数的仿写
void my_strcpy(char* dect, char* ret)
{
	while (*ret != '\0')
	{
		*dect++ = *ret++;
	}
	*dect = *ret;
}

int main()
{
	char arr1[20] = "XXXXXXXXXXXXXX";
	char arr2[] = "hello bit";

	my_strcpy(arr1, arr2);

	printf("%s", arr1);

	return 0;
}

3. 版本3

#include <stdio.h>
//  strcpy函数的仿写
void my_strcpy(char* dect, char* ret)
{
	while (*dect++ = *ret++)
	{
		;
	}
}

int main()
{
	char arr1[20] = "XXXXXXXXXXXXXX";
	char arr2[] = "hello bit";

	my_strcpy(arr1, arr2);

	printf("%s", arr1);

	return 0;
}

4. 版本4

  • 考虑到如果用户传过来的不是指针
  • 如果传入数据写反了等情况
#include <stdio.h>
#include <assert.h>
//  strcpy函数的仿写
void my_strcpy(char* dect, const char* ret)
{
	assert(dect != NULL);
	assert(ret != NULL);
	while (*dect++ = *ret++)// ret中若找到\0则跳出循环,此时*ret已经时\0,再次赋值就可以将\0也拷贝到dect中
	{
		;
	}
}

int main()
{
	char arr1[20] = "XXXXXXXXXXXXXX";
	char arr2[] = "hello bit";
	char p = NULL;

	//my_strcpy(arr1, p); // 错误示例
	//my_strcpy(arr2, arr1); // 会报错
	my_strcpy(arr1, arr2); 


	printf("%s", arr1);

	return 0;
}

总结

VS调试、debug,release、栈区底层简单介绍,好的代码,以及const修饰指针变量以及strcpy函数的仿写

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

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

相关文章

专业护眼灯什么牌子好?2024年专业护眼灯品牌排行分享

专业护眼灯什么牌子好&#xff1f;各位家长可能已经注意到一个令人关切的现象&#xff1a;戴眼镜的孩子人数在不断上升&#xff0c;许多孩子正在接受眼部治疗。眼睛健康的问题变得越来越普遍&#xff0c;这无疑令人担忧。在当今数字化时代&#xff0c;孩子们每日需长时间阅读和…

ssm框架的网上招聘系统的设计与实现,ssm框架,java编程,mysql数据库 myeclipse开发平台

网上招聘是一个功能很复杂的系统&#xff0c;各个部门之间要有一定的协调能力。 要建立一个高效的管理系统的关键问题就是系统内部的各个模块的相互作用&#xff0c;简单的编写一个网站 只用html &#xff0c;css &#xff0c;javascript &#xff0c;xml &#xff0c;xsl技术…

Linux shell编程学习笔记47:lsof命令

0 前言 今天国产电脑提示磁盘空间已耗尽&#xff0c;使用用df命令检查文件系统情况&#xff0c;发现/dev/sda2已使用100%。 Linux shell编程学习笔记39&#xff1a;df命令https://blog.csdn.net/Purpleendurer/article/details/135577571于是开始清理磁盘空间。 第一步是查看…

ocr文字识别软件是干什么的?

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;文字识别软件是一种能够将图像或者扫描的文档中的文字内容转换为可编辑的文本格式的软件。它的主要功能包括&#xff1a; 1. **文字提取&#xff1a;**识别图像中的文字并提取出来&#xff0…

freecad的试用

最近折腾了一台3D打印机&#xff0c;想打印些齿轮啥的做减速箱 然后机械设计软件SolidWorks好像下载很复杂&#xff0c;还得破解。 这里找到一个网站还可以&#xff0c;推荐下 https://321.pw/ 然后我发现solidworks好像太专业了&#xff0c;及时安装了也大材小用。 后来发…

日志集中审计系列(5)--- LogAuditor接收USG设备日志

日志集中审计系列(5)--- LogAuditor接收USG设备日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的实验或…

剑指 Offer 03.:数组中重复的数字

剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。…

高价硕士时代

今天翻到一篇关注读研的文章&#xff0c;里面列举了三个不同经历的研究生的故事&#xff0c;我感觉颜雨宁的经历更有代表性&#xff0c;于是将整理的笔记分享大家。 先来看看学硕和专硕的区别。 颜雨宁考的是专硕&#xff0c;她清楚地意识到这条路不会是平坦的。复旦大学的门槛…

打造人脸磨皮算法新标杆,满足企业多元化需求

高清视频和图片已成为企业展示形象、传递信息的重要载体&#xff0c;拍摄过程中难以避免的皮肤瑕疵和纹理不均等问题&#xff0c;常常让精美的画面失色。美摄科技凭借其领先的人脸磨皮算法解决方案&#xff0c;为企业提供了高效、精细的图像处理服务&#xff0c;让每一帧画面都…

【超简单实用】Zotero 7 内置pdf背景颜色更改插推荐以及安装

Zotero beta7 pdf 内置颜色更换 zetore 6 很多成熟的插件在 zetore 7都不能用了。版本回退看起来内置文章的注释会被消除&#xff0c;所以又不想退回去。前几个月在找beta 7 的pdf 护眼色的插件一直没有&#xff0c;今天终于发现了&#xff01;&#xff01;&#xff01;&#…

5分钟——快速搭建后端springboot项目

5分钟——快速搭建后端springboot项目 1. idea新建工程2. 构建pom.xml文件3. 构建application.yml配置文件4. 构建springboot启动类5. 补充增删改查代码6. 运行代码7. 下一章 1. idea新建工程 点击右上角新建一个代码工程 别的地方不太一样也不用太担心&#xff0c;先创建一个…

如何用微信发布考试成绩(如月考、期中、期末等)

自教育部《未成年人学校保护规定》颁布后,教育部明确表示:学校不得公开学生的考试成绩、排名等信息!同时学校应采取措施,便利家长知道学生的成绩等学业信息,对于教师来说,如何用微信发布考试成绩(如:月考、期中、期末等)就成了一道难题... 公开吧,会伤害到学生自尊心,甚至被投诉…

IDEA本地将镜像推送到coding制品仓库

创建制品仓库 假设仓库名称为docker 在IDEA 添加Docker 注册表 IDEA必须先安装docker插件 地址 用户名和密码就是coding的登录名和密码服务器 最好本地安装docker桌面版&#xff0c;更容易操作 测试连接成功 推送镜像到coding的docker制品仓库 选中某个镜像 鼠标右键 注册表…

保护你的网站:了解5种常见网络攻击类型及其防御方法

随着互联网的迅猛发展&#xff0c;针对网站的各种类型的网络攻击随之增加&#xff0c;网络攻击事件层出不穷&#xff0c;由此&#xff0c;如何保护网站安全成为每个网站所有者的重要议题。在下面的内容中&#xff0c;我们将探讨5种常见网络攻击类型及其防御方法&#xff0c;以帮…

oracle rman restore database的时候报错RMAN-06023: 没有找到数据文件1的副本来还原

一 问题描述 在oracle异地备份恢复测试数据库上执行restore database的时候报错&#xff1a; RMAN-06023: 没有找到数据文件1的副本来还原 可是我看备份明明都是存在的&#xff0c;而且已经执行了catalog start with命令。 有点奇怪的是catalog start with的时候&#xff0c…

数字化转型成功的企业到底是什么样的?

数字化转型成功的企业通常具备以下特征&#xff1a; 1、以客户为中心的业务模式&#xff1a;成功的数字化转型企业将客户放在业务模式的核心位置&#xff0c;通过提供个性化的服务和产品来满足客户需求。这种以客户为中心的模式能够带来更好的客户体验和忠诚度。 2、强大的数…

【数据结构】串(String)

文章目录 基本概念顺序存储结构比较当前串与串s的大小取子串插入删除其他构造函数拷贝构造函数扩大数组空间。重载重载重载重载[]重载>>重载<< 链式存储结构链式存储结构链块存储结构 模式匹配朴素的模式匹配算法(BF算法)KMP算法字符串的前缀、后缀和部分匹配值nex…

RuoYi-Vue-Plus (角色部门-数据权限 @DataPermission使用、自定义数据权限、数据权限拦截 、处理器解读)

本章主要是数据权限控制: 本章按照对部门id,用户id举例控制数据权限 功能: 1.支持自动注入 sql 数据过滤 2.查询、更新、删除 限制 3.支持自定义数据字段过滤 4.模板支持 spel 语法实现动态 Bean 处理 一、角色部门权限@DataPermission 1-使用及简介 权限范围五个 …

《环阳宗海逍遥游》

第一天:《六十八道拐》五月二日游兴浓&#xff0c;大观公园门囗逢。海埂西门再集合&#xff0c;蓝光城里意无穷。呈贡过后松茂过&#xff0c;阳宗镇上心欢融。宜良城中暂歇脚&#xff0c;六十八拐路难通。宜良住宿赏夜色&#xff0c;期待明朝再接龙。 第二天:《情人岛苗王峡行》…

用C#写一个读取pdf文档内容的库

安装这两个库&#xff0c;第二个库一定要安装否则有些pdf文件读取会出现异常 读取 using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Listener;namespace TestReadPdf {public static class PdfHelper{public static IE…