C语言内存函数(与上篇字符函数及字符串函数一起食用效果更佳哦~)

顾名思义,内存函数就是针对内存块(即一块内存)来处理的。

因此本篇所讲的四种内存函数:

  1. memcpy(内存拷贝)
  2. memmove(内存移动)
  3. memset(内存设置)
  4. memcmp(内存比较)

都是通过对内存块的操作处理来实现其功能的。

注:以下内存函数都需要包含头文件<string.h>

1.memcpy函数的使用和模拟实现

memcpy函数的使用:

我们首先通过它的函数名来对它进行一定的理解

因此memcpy可以译为内存拷贝,可以参考作者的上篇博客http://t.csdnimg.cn/JHXyG中对strcpy函数的讲解来帮助理解memcpy函数。

函数的形式如下图:

第一个参数destination存放的是目标空间的地址

第二个参数source存放的是源空间的地址

函数的作用是从source的地址开始向后复制num(即第三个参数)个字节的数据到destination指向的内存位置,返回的是目标空间的起始地址。

可以看到,数据类型都为void*,这是因为内存函数是对内存进行操作的,内存可以存放各种类型的数据,而void*指针可接收任意空间的地址。

那么具体应该如何操作呢?如图:

由上图可以知道,memcpy是以字节为单位进行拷贝的,而第三个参数告诉我们要拷贝的字节数,因此它并不会同strcpy函数一样遇到\0停下来,而是我们让它拷贝多少就拷贝多少。

memcpy函数的模拟实现:

思路:将源空间(即第二个参数)的地址逐字节赋给目标空间(即第一个参数的地址),每赋完一个字节后两个空间的地址向后增加一字节,再赋值,直到赋完num个字节为止。

代码实现如下:



一般情况下memcpy函数的使用及模拟实现我们已经完成,但如果我们此时想将arr1中的“3,4,5”拷给arr2而是想将arr1中的1,2,3,4,5拷贝到arr1中的3,4,5, 6, 7呢?如图:

如果有细心的小伙伴可能会发现这里有问题,(注意,此时源空间和目标空间是同一块内存)当我们目标空间的3,4分别被源空间的1,2拷贝后,此时arr1中的内存分布如图:接着拷贝下去我们发现会一直进行1,2的循环拷贝,显然不是我们所希望的结果,因此memory函数不负责重叠的拷贝。那这种情况我们该怎么办呢?这就引出来了我们要学习的下一个内存函数——memmove

2.memmove函数的使用和模拟实现

memmove函数的使用:

由上文我们知道memcpy不负责重叠的拷贝,因此当目标空间和源空间有重叠时,我们可以使用memmove函数进行拷贝.

memmove函数的形式如下:

跟memcpy类似,memmove函数的第一个参数为目标空间,第二个参数为源空间,num为拷贝的字节数,返回的是目标空间的地址。作用也是将源空间的num个字节的地址复制拷贝到目标空间。只不过它是可以拷贝重叠的空间的。

使用效果如图:

可以正常将重叠的空间进行拷贝。

memmove函数的模拟实现:

首先我们要想想,当空间重叠时,函数是怎么进行拷贝的呢?

如图,此时目标空间(dest)的起始地址 > 源空间(source)的起始地址

我们可以将其倒着拷贝。

而当目标空间的起始地址 < 源空间的起始地址时:

我们可以将其从前往后拷贝。

而当目标空间和源空间没有重叠时从前☞后/从后☞前就都可以了

因此memmove函数的模拟实现代码如下:

void* my_memmove(void* dest, void* source, size_t num)
{void* p = dest;if (dest < source)//此时目标空间的起始地址<源空间的起始地址,从前☞后拷贝{while (num--){*(char*)dest = *(char*)source;dest = (char*)dest + 1;source = (char*)source + 1;}}else//从后☞前拷贝{while (num--){*((char*)dest + num) = *((char*)source + num);}}return p;
}

3.memset (内存设置)函数的使用

函数形式如下:

如图,第一个参数(ptr)为我们要设置的内存

          第二个参数(value)是我们想要的内容

          第三个参数(num)为我们要改变的字节数

因此,memset是用来设置内存的,将内存中的值以字节为单位设置成我们想要的内容

示例如下:

4.memcmp(内存比较)函数的使用 

memcmp函数的学习可以参考http://t.csdnimg.cn/vsA0n中的strcmp函数

memcmp函数形式如下:

作用:比较ptr1和ptr2指针指向的位置开始的向后num个字节

返回值如下:

既然我们已经知道了memcmp函数的作用,那就开始实操了,代码实现如下:当前num个字节相等时返回0。

当arr1<arr2时返回<0的数字

当arr1>arr2时返回>0的数字



完结撒花~

创作不易,来个三连支持一下吧亲🌹🌹~

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

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

相关文章

5.Redis之常用数据结构单线程模型

围绕每个数据结构介绍相关命令当前版本的redis支持10个数据类型 Redis 底层在实现上述数据结构的时候,会在源码层面,针对上述实现进行特定的优化,来达到 节省时间/节省空间 效果,内部的具体实现的数据结构&#xff08;编码方式&#xff09;,还会有变数redis 承诺,现在我这有个 …

【Java EE】网络协议——HTTP协议

目录 1.HTTP 1.1HTTP是什么 1.2理解“应用层协议” 1.3理解HTTP协议的工作过程 2.HTTP协议格式 2.1抓包工具的使用 2.2抓包工具的原理 2.3抓包结果 3.协议格式总结 1.HTTP 1.1HTTP是什么 HTTP&#xff08;全称为“超文本传输协议”&#xff09;是一种应用非常广泛的应…

如何利用GitHubAction来发布自己的Python软件包

我们开发的python软件包如果想发布到网上&#xff0c;可以让其他人通过pip install下载&#xff0c;一般是把软件包发布到PYPI平台。 PYPI准备 我们要现在pypi注册登录一下 文件组织架构 一般的python软件包的文件组织架构为包名文件夹__init__.py程序&#xff0c;包文件夹的…

Django与前端框架协作开发实战:高效构建现代Web应用

title: Django与前端框架协作开发实战&#xff1a;高效构建现代Web应用 date: 2024/5/22 20:07:47 updated: 2024/5/22 20:07:47 categories: 后端开发 tags: DjangoREST前端框架SSR渲染SPA路由SEO优化组件库集成状态管理 第1章&#xff1a;简介 1.1 Django简介 Django是一…

论文阅读--ActionCLIP

原来的动作识别问题在于标注太难太贵&#xff0c;将动作表示为短语的latent space太大 本文的贡献&#xff1a;&#xff08;1&#xff09;将CLIP的image encoder换成video encoder&#xff0c;方法与CLIP4Clip几乎一样 &#xff08;2&#xff09;CLIP的ground truth来自于文本…

urllib_post请求_百度翻译之详细翻译

百度翻译有一个详细翻译的接口&#xff1a; post请求&#xff1a; 请求参数&#xff08;较多&#xff09;&#xff1a; 打印之后&#xff0c;发现有问题&#xff1a; 改一下请求头&#xff1a; 将Accept-Encoding注释掉&#xff0c;因为我们使用的是utf-8编码&#xff1a; 加上…

F28034中断

DSP中断 中断中断概述中断机制 中断 当CPU正在执行程序时&#xff0c;由于发生了某种随机的事件&#xff08;外部或内部&#xff09;&#xff0c;使CPU的执行中断&#xff0c;转而去执行某一段特殊的程序&#xff08;中断子程序或中断处理程序&#xff09;&#xff0c;以处理该…

轻型web服务器搭建 阿里云

1.购买云服务器 2.远程连接云服务器 重置实例密码 重置后要重启服务器 登录云服务器 密码就是刚刚重置的 3.安装宝塔面板 宝塔面板 - 简单好用的Linux/Windows服务器运维管理面板 (bt.cn) 回车则开始安装&#xff0c;过程中会多次让输入y表示确认下一步&#xff0c;过程大概2…

windows使用gzip和bzip2对文件进行压缩

git软件 git bash&#xff1a;下载地址https://git-scm.com/downloads&#xff0c;安装时一路next。 这个软件是给程序员提交代码用的工具&#xff0c;内置linux系统的命令行&#xff0c;可以使用linux系统特有的压缩软件gzip和bzip2. gzip使用 gzip一般用于压缩tar包&#…

基于机器学习的一线城市租房价格预测分析与实现,实现三种算法预测

本文旨在基于机器学习方法&#xff0c;对一线城市租房价格进行预测分析&#xff0c;并使用Matplotlib可视化、随机森林、一元线性回归和多元线性模型进行模型对比。通过爬取北京链家二手房数据作为研究对象&#xff0c;探讨了租房价格与各种因素之间的关系&#xff0c;阐述了研…

【YOLOv10训练教程】如何使用YOLOv10训练自己的数据集并且推理使用

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【气象常用】间断时间序列图

效果图&#xff1a; 主要步骤&#xff1a; 1. 数据准备&#xff1a;随机数组 2. 图像绘制&#xff1a;绘制间断的时间序列 详细代码&#xff1a;着急的直接拖到最后有完整代码 步骤一&#xff1a;导入库包及图片存储路径并设置中文字体为宋体&#xff0c;西文为新罗马&…

冷干机使用中的注意事项

冷干机使用中的注意事项 使用冷干机时&#xff0c;以下是几个注意事项&#xff1a; 安装位置&#xff1a;选择一个通风良好、温度适宜的位置安装冷干机。确保周围环境没有过多的灰尘、腐蚀性气体或其他污染物&#xff0c;以免对冷干机的正常运行和寿命产生不利影响。 电源要求…

C++ STL 函数对象:隐藏的陷阱,如何避免状态带来的麻烦?

STL 函数对象&#xff1a;无状态即无压力 一、简介二、函数对象三、避免在函数对象中保存状态3.1、函数对象3.2、lambda 表达式 四、选择合适的更高层次的结构五、总结 一、简介 在使用 C 标准模板库 (STL) 时&#xff0c;函数对象 (Function Object) 是一种强大的工具&#x…

02324 自学考试 离散数学屈婉玲教材 目录

02324 自学考试 离散数学屈婉玲教材 目录 02324 自学考试 离散数学屈婉玲教材 02324离散数学全程班历年真题资料

技术面试,项目实战,求职利器

之前找工作一直想找一个能真正系统性学开发的地方&#xff0c;之前毕业找工作的时候无意间碰到下面这个网站&#xff0c;感觉还挺不错的&#xff0c;用上面的技术实战内容应对技术面试&#xff0c;也算是求职利器了。有需要的可以自取&#xff1a; https://how2j.cn?p156336 实…

VMware虚拟机中ubuntu使用记录(10)—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ORB_SLAM3源码编译二、ORB_SLAM3实时单目相机测试1. 查看摄像头的话题2. 运行测试 三. 运行测试可能的报错1. 报错一(1) 问题描述(2) 原因分析(3) 解决 2. …

SWM320系列应用

一、Swm320系列 SPI 应用 现象&#xff1a;应用SWM320的SPI1的模式0作为从机&#xff0c;整体产品硬件平台同步上电&#xff0c;从机的SPI无法正常工作&#xff0c;进不了中断&#xff0c;手工复位一次或连接SWD调试就正常了&#xff0c;这样的情况应该怎么解决&#xff1f;其…

Windows远程连接命令?

Windows操作系统提供了多种远程连接命令&#xff0c;使用户可以通过网络连接到远程计算机&#xff0c;并在远程操作系统上执行操作。远程连接命令可方便实现远程工作、故障排查和系统维护等任务。本文将介绍几种常见的Windows远程连接命令及其基本使用方法。 远程连接命令 Win…