模拟实现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(个人建议)

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

相关内容

热门资讯

从合作到反目!千亿房企合景泰富... 本文来源:时代周报 作者:周松清近日,合景泰富集团(01813.HK)发布公告,香港高等法院将清盘呈...
收盘丨A股三大指数震荡分化,银... 12月18日,A股三大指数全天震荡分化,截至收盘,沪指涨0.16%,深成指跌1.29%,创业板指跌2...
华谊兄弟遭阿里创投及马云减持!... 红星资本局12月18日消息,华谊兄弟(300027.SZ)发布公告称,收到股东杭州阿里创业投资有限公...
马斯克身家涨至3200亿美元 11月12日消息,特斯拉在美国时间周一收涨近9%,推动全球首富马斯克的身家再上一层楼。福布斯富豪榜数...
在岸人民币兑美元收报7.215... 11月12日消息,在岸人民币兑美元北京时间03:00收报7.2150,较上一交易日夜盘收盘跌290点...
特朗普为金融机构物色支持加密货... 11月12日消息,据报道,美国候任总统特朗普正准备让美国政府对加密货币采取更宽松的立场,他正在物色对...
新亚制程:股票简称变更为“ST... 11月11日消息,新亚制程公告,公司于2024年11月11日收到中国证监会浙江证监局下发的《行政处罚...
波罗的海干散货运价指数涨4.2... 11月11日消息,波罗的海干散货运价指数报1558点,涨4.21%。
左手分红右手补流,华东理工“学... 三年半分红5400万元。作者|卓玛编辑|刘钦文小小一枚芯片要如何保护?半导体器件的生产流程主要分为两...
阿里打假联盟:知产扶优计划已有... 图说:12月17日,淘天集团副总裁叶智飞在阿里巴巴打假联盟第八届大会上作主旨发言。12月17日,阿里...