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

news2025/1/11 14:28:00

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

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

  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.coloradmin.cn/o/1692007.html

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

相关文章

RocketMQ使用(3):消息重复

一、问题说明 发送时消息重复 当一条消息已被成功发送到服务端并完成持久化&#xff0c;此时出现了网络闪断或者客户端宕机&#xff0c;导致服务端对客户端应答失败。如果此时生产者意识到消息发送失败并尝试再次发送消息&#xff0c;消费者后续会收到两条内容相同并且Message…

vue项目elementui刷新页面弹窗问题

bug&#xff1a;每次刷新页面都有这个鬼弹窗。 刚开始以为是自己的代码问题&#xff0c;于是我翻遍了每一行代码&#xff0c;硬是没找出问题。 后来在网上找了些资料&#xff0c;原来是引入的问题。 解决方案&#xff1a; 改一下引入方式即可。 错误姿势 import Vue from …

Autodesk 3ds Max下载,3ds MAX 2024三维建模渲染软件安装包下载安装

3ds MAX中文版&#xff0c;其强大的功能和灵活的操作为广大用户提供了无限的创意空间&#xff0c;使得高质量动画、最新游戏、设计效果等领域的制作需求得以完美满足。 ​ 作为一款三维建模软件&#xff0c;3ds MAX中文版具备极高的建模精度和渲染质量。它支持多种建模方式&am…

Golang项目代码组织架构实践

Golang在项目结构上没有强制性规范&#xff0c;虽然这给了开发者很大的自由度&#xff0c;但也需要自己沉淀一套可行的架构。本文介绍了一种项目布局&#xff0c;可以以此为参考设计适合自己的 Golang 项目组织模式。原文: Golang Project Layout Go 有很多强制的或是约定俗成的…

Python学习---基于TCP协议的网络通信程序案例

TCP简介&#xff1a; ●TCP 面向连接、可靠的、基于字节流的传输控制协议 ●TCP的特点 ○面向连接 ○可靠传输 ■应答机制 ■超时重传 ■错误校验 ■流量管控 ●TCP通信模型 TCP严格区分客户…

2024年5月25日 十二生肖 今日运势

小运播报&#xff1a;2024年5月25日&#xff0c;星期六&#xff0c;农历四月十八 &#xff08;甲辰年己巳月己丑日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;鸡、鼠、猴 需要注意&#xff1a;马、狗、羊 喜神方位&#xff1a;东北方 财神方位&#xff1a;…

篮球论坛|基于SprinBoot+vue的篮球论坛系统(源码+数据库+文档)

篮球论坛系统 目录 基于SprinBootvue的篮球论坛系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff…

抖音运营_打造高流量的抖音账号

目录 一 账号定位 行业定位 用户定位 内容定位 二 账号人设 我是谁? 我的优势 我的差异化 三 创建账号 名字 头像 简介 四 抖音养号 为什么要养号&#xff1f; 抖音快速养号 正确注册抖音账号 一机一卡一号 实名认证 正确填写账号信息 养号期间的操作 五…

OpenWrt 23.05 安装中文语言包 教程 软路由实测 系列三

1 web 登录 #更改阿里云下载源&#xff0c;可参考第一篇文章:OpenWrt U盘安装使用 详细教程 x86/64平台 软路由实测 系列一-CSDN博客

如何网页在线编辑 Office word 文档,并支域功能:创建域/插入域/替换域等

在日常在线办公场景中&#xff0c;我们经常会遇到一些复杂的文档编辑需求&#xff0c;特别是我们经常会遇到一些复杂的数学公式&#xff0c;会用到“域”功能&#xff0c;“域”功能便是一个高级且实用的工具。通过设置域&#xff0c;用户可以实现文档的自动化处理&#xff0c;…

聚观早报 | 华为畅享 70S真机图赏;vivo Y200 GT开售

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月25日消息 华为畅享 70S真机图赏 vivo Y200 GT开售 一加13部分细节曝光 马斯克谈AI未来 三星Galaxy Z Fold6将…

轻量级 K8S 环境 安装minikube

文章目录 操作系统DockerDocker CE 镜像源站使用官方安装脚本自动安装 &#xff08;仅适用于公网环境&#xff09;安装校验Docker代理docker permission denied while trying to connect to the Docker daemon socket minikubekubectl工具minikube dashboard参考资料 操作系统 …

[图解]产品经理创新之阿布思考法

0 00:00:00,000 --> 00:00:01,900 那刚才我们讲到了 1 00:00:02,730 --> 00:00:03,746 业务序列图 2 00:00:03,746 --> 00:00:04,560 然后怎么 3 00:00:05,530 --> 00:00:06,963 画现状&#xff0c;怎么改进 4 00:00:06,963 --> 00:00:09,012 然后改进的模式…

简洁实用视频播放器-PotPlayer

一、前言 PotPlayer 是一款简洁实用的视频播放器。 发现的确是良心软件&#xff0c;只有20M 的大小&#xff0c;占内存是同类软件最低的。不要小看它那么小巧简洁&#xff0c;但也很强大的&#xff0c;支持强劲的加速引擎&#xff0c;同时支持3D 视频。 同时支持多种编码和字…

生产物流智能优化系统

对生产调度、物流调度【车辆路径问题、配送中心拣选问题】智能优化算法研究形成系统性程序&#xff0c;逐步开发设计一个智能优化系统【包括&#xff1a;问题说明、实验界面、算法结构和算法程序应用说明】&#xff0c; 当前完成TSP和集送车辆路径的算法程序&#xff0c;程序效…

移动端仪表盘,支持更多组件

05/22 主要更新模块概览 定位函数 快捷筛选 轨迹图表 时间组件 01 表单管理 1.1 【表单组件】- 表单关联新增支持自定义按钮样式 说明&#xff1a; 表单关联-关联数据按钮&#xff0c;原仅支持默认按钮样式&#xff0c;现增加关联数据按钮自定义功能&#xff0c;满…

生活小区火灾预警新篇章:泵吸式可燃气体报警器的检定与运用

在现代化的生活小区中&#xff0c;燃气设备广泛应用于居民的日常生活之中&#xff0c;但同时也带来了潜在的火灾风险。 可燃气体报警器作为一种安全监测设备&#xff0c;能够及时检测到燃气泄漏等安全隐患&#xff0c;并在达到预设的阈值时发出警报&#xff0c;提醒居民采取相…

Doris集群安装部署

Doris集群安装部署 一、环境搭建 1、环境准备 主机名IP角色doris1192.168.100.131Frotend,Backenddoris2192.168.100.132Backenddoris3192.168.100.133Backend 2、Doris整体架构 Frontend&#xff08;FE&#xff09; 主要负责用户请求的接入、查询解析规划、元数据的管理…

Python学习---基于HTTP的服务端基础框架搭建案例

整体功能&#xff1a; 1 创建框架构建相关的文件夹 2 创建app,模块文件 3 在 app模块文件中创建application函数(用于处理请求) 4 将request_handler()中的处理逻辑交由app模块的application函数完成 5 app模块的 application函数返回响应报文 6 在application 文件夹中创建一个…

blender 布尔运算,切割模型。

1.创建一个立方体和球体。 2.选中立方体&#xff0c;在属性面板添加布尔修改器。点击物体属性右边的按钮选中球体。参数如下。 3.此时隐藏球体&#xff0c;就可以看到被切掉的效果了。