memcpy和memmove的区别

memcpy实现:

char *memcpy(void *s1, const void * s2, size_t n)
{
    char *su1;
    const char *su2;

    for(su1=s1,su2=s2; 0<n; ++su1, ++su2, --n)
        *su1=*su2;
    return s1;
}

memcpy可能造成因内存区域重叠造成的复制错误,但是它的执行速度很快,适用于已确定源和目标不会重叠的情况。

memmove实现:

void * memmove( void *s1, const void *s2, size_t n)
{
    char * sc1;
    const char * sc2;

    sc1=s1;
    sc2=s2;
    if( sc2< sc1 && sc1< sc2 +n)
        for(sc1 +=n,sc2+=n; 0<n ;--n)
            *--sc1=*--sc2;
    else
        for(; 0<n; --n)
            *sc1++=*sc2++;
    return sc1;
}    

memmove的三种情况处理:

1.当源字符串的起始地址比目标地址高时,不会造成内存重叠出现的复制错误(但是可能会造成源字符串的破坏),此时使用正向复制;

2.当源字符串的起始地址比目标地址低,且复制后二者没有重叠时(sc1<sc2+n),也不会造成错误,使用正向复制;

3.当源字符串的起始地址比目标地址高,而复制后二者区域有重叠,则正向复制将造成错误,使用逆向复制。

因为memmove对复制的处理进行了判断,所以它的效率低于memcpy,但是增加了安全性。

转载于:https://www.cnblogs.com/knd2/archive/2013/03/10/2953044.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值