C语言——memmove与memcpy的实现

目录

一,了解memmove与memcpy

1.memcpy

2.memmove

二,memmove与memcpy的实现

1.memcpy:

2.memmove的实现

为什么同时有memmove和memcpy两种功能相似的函数

memmove的实现

注意:


一,了解memmove与memcpy

1.memcpy

 是将原字符串src的前count个字节所存储的数据存放到目标字符串dest处。

2.memmove

而memmove与memcpy的返回类型,参数都一致,功能也相似,是将原字符串src的前count个字节存储的数据移动到目标字符串dest中。

二,memmove与memcpy的实现

1.memcpy:

 P.S.

        1.返回类型,输入参数为void*类型是由于void*类型的指针可以接受各种不同类型的指针,所以memcpy不同于strcpy的区别就是memcpy可以copy各种类型的数据。

        2.函数实现方法:通过强制类型转换来将void*类型的指针转化为char*的指针,再通过一个字节一个字节的拷贝来完成函数的实现

2.memmove的实现

为什么同时有memmove和memcpy两种功能相似的函数

 

arr1为1,2,3,4,5,6,7,8,9

将arr1的前四个元素放到arr1+2也就是arr1[2]的位置上,那么得到的结果应该为:

1,2,1,2,3,4,7,8,9

但发现运行结果为:

分析:

将arr1[0] -> arr1[2]中  1,2,1,4,5,6,7,8,9

将arr1[1] -> arr1[3]中 1,2,1,2,5,6,7,8,9

将arr1[2] -> arr1[4]中 1,2,1,2,1,6,7,8,9

将arr1[3] -> arr1[5]中 1,2,1,2,1,2,7,8,9

这时候发现是由于存储时覆盖了原本的数据而影响了结果

因此为了避免这种影响,就有了memmove函数。

memmove的实现

通过此图可以发现:

当dest<src时(也就是dest1的位置),需要从前往后移动数据

当dest>src时(也就是dest2的位置),需要从后往前的移动数据

而当dest与src所占据的空间没有重叠时,无论哪种方式移动数据都可以。

代码实现: 

注意:

在VS 2019编译器下,无论是memcpy也是通过memmove的方式实现的,因此二者无差,但在别的编译器下的memcpy可能不能实现空间重叠是的数据拷贝。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值