memcpy函数与memmove函数区别与实现

1 篇文章 0 订阅

  memcpy与memmove函数都是内存拷贝函数,其区别在于memcpy一般用于两组数据的拷贝;使用方法很简单。

这是memcpy函数的自主实现;返回类型为可能为任意类型的指针所以用void*定义;将两个数组内存解引用赋值就行,最后进行自增操作,注意强行转换为char*类型;这样才能保证+1跳过了一个字节;这样才能挨个字节的赋值。这个函数的实现比较简单。最后返回数组的地址即可。

   接下来就是memmove函数这个函数勇于同一个数组间的拷贝,这个相对memcpy比较难理解。假设我定义了一个一到十的数组arr使用函数memmove(arr+4,arr,20);此时20字节代表我要拷贝5个整型数字;结果会是

那这与memcpy有什么差别呢?看下图memcpy的运行结果 

这个例子是第9个数字上的差别;原因是什么呢?其实memcpy函数运行出来的这个是一个错误的结果。因为从第5个数字开始后面的数字拷贝了原数组的前五位,那这样说的话第9位数应该是5才对如memmove的运行结果,为什么用memcpy会这样呢?是因为原数组第五位数已经拷贝了原数组的第一位数字1;那此时的第五位数字已经是1了;所以第9位数字在拷贝的时候变成了第五位的1;这并不是我们想要的结果;但memmove函数可以进行这一操作,避免重叠拷贝,这就是memcpy与memmove的真正差别。那我们现在开始进行memmove函数的实现。如下图 毕竟都是拷贝,那方法都是大同小异,当dest的地址在src的前面时memmove与memcpy的原理相同所以代码完全一样;这种情况不会重叠拷贝。当dest的地址在src的后面时当拷贝的字节多时可能出现重叠拷贝。所以方法不同,为了避免重叠拷贝,我们可以从后面开始拷贝,也就完成了这个函数的自主实现。代码已呈现,memmove函数第二种情况的实现可以自己再下去理解一下,再想想这样才能彻底理解,那就这样。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值