C标准库string.h之--------------memcpy与memmove函数的区别剖析

memcpy和memmove均为内存拷贝函数,原型分别为:

 void *memcpy(void *dest, const void *src, size_t n);
 void *memmove(void *dest, const void *src, size_t n);

当拷贝的内存存在重叠区域时,memcpy可能会发生错误,而memmove不会发生。
下图为重叠情况剖析【绿色代表重叠区域】:
重叠情况(1):
这里写图片描述
重叠情况(2):
这里写图片描述

两个函数具体实现如下:

void *memcpy(void *dst, const void *src, size_t n)    /*将src 的 n 字节拷贝到dst 内存中*/
{
    char *su1;
    const char *su2;

    for(su1 = dst, su2 = src; 0 < n; ++su1, ++su2, --n)
    {
        *su1 = *su2;
    }
    return dst;
}
void *memmove(void *dst, const void *src, size_t n)    /*将scr 的 n 字节拷贝到dst 内存中*/
{
    char *sc1;
    const char *sc2;

    sc1 = dst;
    sc2 = src;
    if(sc2 < sc1 && sc1 < sc2 + n)
    {
        for(sc1 += n, sc2 += n; 0 < n; --n)     /* 从内存块的后面开始拷贝 */
        {
            *--sc1 = *--sc2;
        }
    }
    else
    {
        for(; 0 < n; --n)       /* 从内存块的前面开始拷贝 */
        {
            *sc1++ = *sc2++
        }
    }
    return dst;
}

总结:
1、从源码的具体实现可以看出memmove已经包含了memcpy的功能。
2、只有在情况二的重叠情况下,即src < dst && dst < src + n (就是dst内存地址比src大,且拷贝n字节时存在重叠区域),就从内存块的后面开始拷贝
3、平时应用中,很多时候使用memcpy,因为可以确定不重叠,执行显然比memmove快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值