打开C语言常用的内存函数大门(二)—— memmove()函数 (内含memmove的讲解和模拟实现)

文章目录

  • 1. 前言
  • 2. memmove()函数
    • 2.1 memmove()函数与memcpy()函数的差异
    • 2.2 memmove()函数的原型
    • 2.3 memmove()函数的使用案例
  • 3. memmove()函数的模拟实现
  • 4. 总结

1. 前言

在之前,我向大家介绍了C语言中的一个常用的内存函数memcpy函数。如果你还没看的话,建议你先去看memcpy函数这篇文章,因为接下来,可能会用到那篇文章的知识甚至会拓展没有讲过的知识。强烈建议先去看把一篇文章,文章链接:memcpy函数讲解及其模拟实现(点此查看即可)

那么在本文中,我将介绍继续介绍C语言中常用的内存函数——memmove()函数。

2. memmove()函数

memmove()函数的作用:将源空间的内容移动到目标空间上,也可以理解为将指定源空间的内容拷贝到目标空间中。

可能看到这里有的读者就会提出这么一个问题:
这不是跟memcpy()函数的功能一样吗?这是不一样的,可不敢将两者给弄混了。

2.1 memmove()函数与memcpy()函数的差异

在我们用memcpy函数时,不知道大家有没有想过这么一个问题:

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

	memcpy(arr1+3,arr1,12); //用memcpy拷贝自身的数据给自身

	for (int i = 0; i < 10; i++)
	{
		printf("%d ",arr1[i]);
	}

	return 0;
}

在VS上面你可能会成功运行这段代码,但这并不意味着这段代码是不存在问题的。你若是换一个别的编译器,可能上面的代码就跑不起来了。为什么会这样呢?

事实上,这种行为在memcpy函数看来是属于未定义的行为(想要操作的同一个对象里的俩成员之间出现了内存交织的情况)。你不妨想一下,你对一个未定义的行为进行了操作,这不就属于脱离了编译器的掌控,这种行为是十分危险的。编译器要的是稳稳的幸福。

那既然不能这么做,那有没有别的办法?
答案是有的,就是本文的主角—— memmove函数。

这也正是导致memmove函数与memcpy函数的差异所在
memmove函数能够处理同一个对象里的俩成员间内存空间出现交织的情况,而这正是memcpy函数所做不到的

可能读者们听到这里还是有点懵逼,到底什么情况下会出现内存交织的情况?
下面我将给出一副图,看完这幅图你也许就会懂了:
图解
结合着要求看,不难发现,元素4即是拷贝内容也是待拷贝内容的区域。不妨想一下,如果我们按照memcpy函数的方式进行内存操作时,那么元素1就会覆盖元素4的值,那么4这个数据就消失了。这个不是我们想看到的。因此,这也就是为什么memcpy函数处理不了内存空间有交织的数据的本质原因。

相信看完上述的解释后,你已经对memmove在什么情况下使用已经有大概的印象了。

那么接下来,我们就一起来探讨一下memmove函数如何使用?

2.2 memmove()函数的原型

memmove函数原型

void * memmove ( void * destination, const void * source, size_t num );

这个跟memcpy的参数意思是一样的。为了提高读者们的学习效率,这里我就再写一遍:

返回值和形参作用
返回值类型:void*返回目的地空间的地址。(说大白话,就是返回你想要拷贝内容到那个空间的地址,不过我们很少会用到它的返回值)
destination一个空指针类型的变量,指向待拷贝空间的地址处
sourceconst void* 指针类型的变量,指向拷贝内容的空间地址处
numsize_t类型的变量 , 表明我要拷贝多少个字节数的内容

2.3 memmove()函数的使用案例

案例一:拷贝整形数据
案例一

案例二:拷贝字符型数据
案例二

相信通过上述例子,你已经学会了如何使用memmove()函数。

3. memmove()函数的模拟实现

又到本文最精彩的时候了,函数的模拟实现。

以下是编程思路:
编程思路

下面是实现代码(可以对着思路理解代码):

模拟实现的代码

4. 总结

在本文中,我介绍了memcpy与memmove两个函数的差异、memmove函数的使用及其模拟实现。
希望读者们下来好好理解消化。
👍👍👍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Check Point 安全网关任意文件读取漏洞复现(CVE-2024-24919)

Check Point 安全网关任意文件读取漏洞复现(CVE-2024-24919) 1.漏洞描述 Check Point Security Gateways 是 Check Point Sofware 提供的一系列 网络安全Q解决方案。这些解决方案包括下一代防火墙(NGFW)、数据中心安全网关和 A1驱动的量子网关&#xff0c;旨在为企业提供针对…

反思 GTC 和 OFC 2024:没有一刀切的方法,但上市时间是关键!

在GTC 2024期间&#xff0c;英伟达宣布了最新的Blackwell B200张量核心GPU&#xff0c;旨在为万亿参数的AI大型语言模型提供支持。Blackwell B200需要先进的800Gbps网络&#xff0c;完全符合在AI工作负载的AI网络报告中概述的预测。随着人工智能工作负载的流量预计每两年增长10…

销量逆袭!敦煌店铺如何靠自养号测评轻松引爆市场?

对于众多卖家而言&#xff0c;踏入中国领先的B2B跨境电商平台&#xff0c;如同步入了充满无尽机会的金矿。然而&#xff0c;有些卖家在平台上努力经营&#xff0c;但订单却寥寥无几。那么&#xff0c;究竟是什么原因导致了这种情况&#xff1f;接下来&#xff0c;我们将结合实际…

小程序webView 实现小程序内嵌H5页面

web-view | 微信开放文档 本案例新建了一个 webView页面 只渲染webView组件 配置路由,跳转页面的时候 前缀使用‘/subPages/webView/index?weburlhttps://xxxxx’ componentDidMount 的时候 获取路由中的 weburl 地址参数 async componentDidMount() {const router getCurre…

Coolmuster Android Assistant: 手机数据管理的全能助手

在数字化时代&#xff0c;智能手机不仅是通讯工具&#xff0c;更是个人数据的中心。随着数据量的不断增加&#xff0c;如何有效管理和保护这些数据成为了一个重要议题。Coolmuster Android Assistant应运而生&#xff0c;它是一款专为安卓用户设计的综合数据管理软件&#xff0…

九部门联合发文知识产权保护体系建设,微版权打造全链条知产保护

近日&#xff0c;国家知识产权局会同中央宣传部、最高人民法院、最高人民检察院、公安部、司法部、商务部、海关总署、国家市场监督管理总局等八部门联合印发《知识产权保护体系建设工程实施方案》(以下简称《方案》)&#xff0c;共同加强知识产权保护体系建设。 《方案》是新时…

使用vscode调试c++、python、torchrun、deepspeed程序

目录 调试模式启动(Launch)模式调试c++launch.jsontasks.json附加(Attach)模式调试pythondebug torchrun和deepspeedlaunch.json参考VSCode通过其强大的扩展生态系统和灵活的调试配置,为C++、Python以及特定工具链如TorchRun和DeepSpeed的调试提供了便捷的方式。通过合理配…

初识Spring Cloud Gateway

文章目录 一、网关简介1.1 网关提出的背景1.2 网关在微服务中的位置1.3 网关的技术选型1.4 补充 二、Spring Cloud Gateway的简介2.1 核心概念&#xff1a;路由&#xff08;Route&#xff09;2.2 核心概念&#xff1a;断言&#xff08;Predicate&#xff09;2.3 核心概念&#…

手机文件管理软件哪个好?巧用文件命名分类工具,文件清晰醒目!

随着智能手机功能的日益强大&#xff0c;我们日常使用手机存储的文件也越来越多&#xff0c;如何高效地管理这些文件成为了许多人的需求。因此&#xff0c;手机文件管理软件应运而生&#xff0c;它们能够帮助我们更好地组织、查找和编辑手机中的文件。在众多手机文件管理软件中…

结构体(C保姆级讲解)

前言&#xff1a; 为什么会有结构体&#xff0c;结构体可以用来面熟一个复杂对象&#xff0c;我们知道C语言中有哪些数据类型&#xff0c;有整型&#xff0c;有浮点型&#xff0c;有字符型&#xff0c;但是在生活中&#xff0c;我们需要描述一些比较复杂的东西&#xff0c;比如…

Vitalik:Layer2 是以太坊社区文化的延伸

原文标题&#xff1a;《Layer 2s as cultural extensions of Ethereum》 撰文&#xff1a;Vitalik Buterin&#xff0c;以太坊联合创始人 编译&#xff1a;Chris&#xff0c;Techub News 在我最近关于 L1 和 L2 扩容差异的文章中&#xff0c;我最终得出的结论是&#xff0c; …

java——网络编程套接字

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 目录 2.网络编程套接字2.1 socket api2.2 TCP和UDP之间的区别有连接 vs 无连接可靠传输 vs 不可靠传输面向字节流vs面向数据报全双工 vs 半双工 2.3UDP数据报套接字编程UDP 回显服务器UDP客户端…

Mariadb操作命令指南

MariaDB简介 ​ 以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性&#xff0c;因使用而带来的风险与本站无关&#xff01; 数据库应用程序与主应用程序分开存在&#xff0c;并存储数据集合。 每个数据库都使用一个或多个API来创建&#xff0c;访问&#xf…

ch4网络层---计算机网络期末复习(持续更新中)

网络层概述 将分组从发送方主机传送到接收方主机 发送方将运输层数据段封装成分组 接收方将分组解封装后将数据段递交给运输层网络层协议存在于每台主机和路由器上 路由器检查所有经过它的IP分组的分组头 注意路由器只有3层(网络层、链路层、物理层) 网络层提供的服务 一…

ArcGIS教程(02):创建多模式网络数据集

启动“新建网络数据集”向导 命名网络并选择源要素类 输入网络数据集名称【ParisMultimodal_ND】&#xff0c;点击【下一页】 点击【全选】网络数据集中的要素类 点击【下一页】 设置连通性和高程策略 点击【连通性】 Metro_Entrances 的每个要素与街道要素类的折点重…

企业文件加密:保障知识产权与客户隐私

在数字化时代&#xff0c;企业文件的安全成为了保护知识产权和客户隐私的关键。随着网络攻击和数据泄露事件的日益增多&#xff0c;企业必须采取强有力的措施来确保其敏感信息的安全。文件加密技术作为一项重要的数据保护手段&#xff0c;对于维护企业的竞争力和客户信任至关重…

第八十三节 Java面向对象设计 - Java方法重载

Java面向对象设计 - Java方法重载 在同一类中具有多个具有相同名称的方法称为方法重载。 类中具有相同名称的方法可以是声明的方法&#xff0c;继承的方法或两者的组合。 重载方法必须具有不同数量的参数&#xff0c;不同类型的参数或两者。 方法的返回类型&#xff0c;访问…

数字孪生技术为何备受各行业青睐?

数字孪生技术近年来在各行业中受到越来越多的重视&#xff0c;这是因为它具备了显著的优势和广泛的应用前景。数字孪生是指利用数字化技术&#xff0c;在虚拟空间中创建一个与现实世界对应的虚拟模型&#xff0c;通过数据的实时交互和反馈&#xff0c;实现对物理实体的模拟和监…

3d模型移动中心点偏移太远怎么解决?---模大狮模型网

在3D建模和动画制作中&#xff0c;移动模型时确保中心点的准确性至关重要。然而&#xff0c;有时候在移动模型时&#xff0c;中心点可能会偏移得太远&#xff0c;导致操作不便甚至影响到后续的工作流程。本文将介绍在3D模型移动中心点偏移太远时的常见原因&#xff0c;并提供解…

Linux系统编程——动静态库

目录 一&#xff0c;关于动静态库 1.1 什么是库&#xff1f; 1.2 认识动静态库 1.3 动静态库特征 二&#xff0c;静态库 2.1 制作静态库 2.2 使用静态库 三&#xff0c;动态库 3.1 制作动态库 3.2 使用动态库一些问题 3.3 正确使用动态库三种方法 3.3.1 方法一&…