C语言 memcpy 和 memmove

原博客在https://www.cnblogs.com/god23bin/p/14711408.html

以下仅个人笔记,比较乱。建议去原作者那看,写的比较详细。

这俩参数都是一样的(void * destination, const void * source, size_t num),可参考其他博客。。。

int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

// 想把12345 拷贝到 34567上去  

// 应该打印 1 2 1 2 3 4 5 8 9 10
memcpy实际结果是1 2 1 2 1 2 1 8 9 10

为啥呢?搜了好多,看不懂。。。

直到看到大神写的,非常感谢。刚学C语言,不知道理解是否正确,仅供参考

这种重叠区域拷贝是source的指针开始位置,des的指针开始位置一个一个copy,copy一个两个指针都移动一个位置,相当于两个指针指向的内存进行copy,但是重叠区域的地址会执行copy操作,memcpy会导致数据不对。所以有了memmove
memmove是看重叠是靠前的就倒序拷贝,重叠靠后的就顺序拷贝,避免重叠区域copy被已copy过的内存重新copy.///
但实际上clion用的编译器貌似优化过此问题,所以,俩函数操作结果都一样,不会出现错误。。。

实际copy是在同一个内存块,Source和Destination每次copy结束都是同样的值。。。
memmove则是倒序copy避免重叠区域345被提前copy替换。。。相反如果重叠区域是相反的就是Source与Destination换一下,把34567 拷贝到12345.就是 顺序copy

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值