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,但是增加了安全性。

posted on 2013-03-10 20:39  knd2  阅读(213)  评论(0编辑  收藏  举报

导航