模拟实现memcpy和memmove(详讲)
创始人
2025-05-30 10:57:30
0

在模拟实现qsort的时候,我们知道的是这个函数的返回值是void,这个函数的第一个形参是void* base,因为这个函数可以排序的是任何类型的数据,所以,他就用void* ,因为创造这个函数的人不知道使用者到底要排序的是什么类型的数据,所以用void* 来代替。那么讲这些的作用是什么呢?下面我们在实现memcpy和memmove的时候用到了这个知识点。

1.memcpy

这个函数的第一个参数和第二个参数就不在详细讲,上篇博客都详细说过,来说说第三个参数,第三个参数是多少个字节,是以字节为单位的 ,而不是元素,这个一定要分清楚,不然在拷贝的时候会出现意想不到的错误。

那么下面就来看看这个函数的是怎么使用的吧:

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr1[20] = { 0 };memcpy(arr1, arr, 40);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

这个函数的使用方法如上,没什么好说的,就是拷贝数据。

下面来看看我们模拟实现的:

void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest && &src);while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr1[10] = { 0 };my_memcpy(arr1, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

 这里详细讲一下实现过程,这个函数的实现思路其实很简单的,就是一一赋值,这里因为我们不知道使用者想要拷贝什么类型的数据,所以就是我们要把强制类型转换为char*,这样就可以一个一个字节的拷贝了,但是要注意的是,强制类型转换是临时的,也就是不是永久性的,这个要谨记,不然拷贝的时候会报错。下面来看看我们打印结果:

因为要拷贝的是20个字节,也就是5个整形数据,所以这里是1234500000.

2.memmove

这个函数的功能是拷贝,和上面的函数功能一样,但是他们两有明显的区别,等会会详细讲。

先看看库里函数的代码以及打印:

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr1[10] = { 0 };memmove(arr1, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

 

这个就不再多说,直接看我们是怎么模拟实现的这个函数 :

void* my_memmove(void* dest, const void* src, size_t num)
{assert(dest && src);if (dest < src){while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{while (num--){*(char*)((char*)dest + num) = *(char*)((char*)src + num);}}
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr1[10] = { 0 };my_memmove(arr1, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

代码以及打印结果都在上面,下面就说说这两个之间的区别吧,因为这两个都是拷贝数据,所以他们之间肯定会有所不同,先说memcpy,不知道有没有人在思考的是怎么给自己拷贝,也就是拷贝的时候重叠数据的问题,这个时候怎么办,还能用这个函数吗,答案是肯定的不能,这时候就用上 memmove这个函数了,为啥呢?因为这个函数虽然也是拷贝,但是你可以理解为他的作用范围比memcpy的范围广,能力比memcpy的强就可以了。所以在拷贝的时候,不知道该用哪个函数的时候,就用memmove(个人建议)

最后,如果你觉的本篇本科对你有用的话,就点一下赞吧!谢谢支持!

相关内容

热门资讯

企业帮助文档搭建步骤 产品帮助文档是指一份或多份文件,用于帮助用户了解、学习和使用产品。产品帮助文档通常包括...
梦幻西游单机架设教程-端游篇 准备工具:GGE服务端客户端服务器源码废话不多说教程开始我们打开GEE双击打开ggem...
线性动态规划问题 文章目录1. 三角形中最小路径之和2. 最长递增子序列3. 最长公共子序列 1. 三角形中最小路径之...
信息系统安全(对称加密)-软件... 计算机网络-计算子网掩码(下)-软件设计(三十࿰...
css单位px,rem,em,... pxpx就是pixel像素的缩写,相对长度单位,网页设计常用的基本单位。...
【独家】华为OD机试 - 删除... 最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真...
2025韩系车太委屈!全球第4... 2025年韩系车,真的“寒”前两日,小编为大家分享了一下,2025年度美系车在中国汽车市场艰难的表现...
【C++】面向对象之继承 谈到面向对象的三大特性,必然绕不开封装、继承和多态。 但是需要明确的是三大特性是所有的...
【 Deep-Shallow ... A Deep-Shallow Fusion Network with Multi-Detail Ex...
机器学习必知的基础概念(Fun... 机器学习必知的基础概念(Fundamental Theories of Machine...
Word怎么转换成PDF文件格... PDF是一种通用的文件格式,它可以在不同操作系统和设备上保持一致的显示效果。在日常工作...
【C++】面试101,二叉搜索... 目录 1.二叉搜索树的最近公共祖先  2.在二叉树中找到两个节点的最近公共祖先 3.序列化二叉树 4...
linux简单入门 目录Linux简介Linux目录结构Linux文件命令文件处理命令文件查看命令常用文件查看命令Lin...
LP周报丨央企创投母基金来了,... 一级市场再现重量级玩家。本周,由国务院国资委指导、中国诚通控股集团有限公司牵头组建的“诚通科创投资基...
估值600多亿,马斯克的超级独... 刚宣布回归全天候工作没多久,马斯克便给旗下公司融了一笔钱。几天前,马斯克创立的脑机接口公司Neura...
Python3 入门教程||P... Python3 数据结构本章节我们主要结合前面所学的知识点来介绍 Python 数据结构。列表Pyt...
0110 Tomcat 1.JavaWeb 所有通过Java语言编写可以通过浏览器访问的程序的总称叫JavaWebÿ...
C++ Primer第五版_第... 文章目录练习4.1练习4.2练习4.3练习4.4练习4.5练习4.6练习4.7练习4.8练习4.9练...
LuaJIT 栈帧布局(sta... 对于任何的目标架构(如x86、arm、loongarch),...
【必看】最全开窗函数讲解和实战... 窗口函数(Window Function)是 SQL2003 标准中定义...