[转]memcpy和memmov

来源:互联网 发布:fake it till make it 编辑:程序博客网 时间:2024/06/07 07:07

void* memcpy(void* dest, void* source, size_t count)   
{   
    void* ret = dest;   
    //copy from lower address to higher address   
    while (count--)   
        *dest++ = *source++;   
    return ret;   
}   
  
void* memmove(void* dest, void* source, size_t count)   
{   
    void* ret = dest;   
  
    if (dest <= source || dest >= (source + count))   {   
        //Non-Overlapping Buffers   
        //copy from lower addresses to higher addresses   
        while (count --)   
            *dest++ = *source++;   
    }   
    else {   
        //Overlapping Buffers   
        //copy from higher addresses to lower addresses   
        dest += count - 1;   
        source += count - 1;   
        while (count--)   
            *dest-- = *source--;   
    }   
  
    return ret;   
}   

注意区别: 
memcpy需要保证复制以后,原有数据source不被破坏。
memmove有移动的意思,原有数据可能,注意是可能被破坏掉。但memmove不清除原有数据。
但我有一个想法:memmove的实现显然有累赘的代码,其实无论区域是否重叠,用高位向低位复制的方法肯定不会有问题,又何苦要用if...else呢,按如下代码即可:
C代码

void* memmove(void* dest, void* source, size_t count)   
{   
    void* ret = dest;   
  
    //Think of Overlapping Buffers   
    //copy from higher addresses to lower addresses   
    dest += count - 1;   
    source += count - 1;   
    while (count--)   
            *dest-- = *source--;   
  
    return ret;   
}  


我想,之所以采用判断的方式分别进行,主要是展现一下move的思路,增强可读性吧,当两个区域不会重叠的时候,memmove和memcpy是等价的。
通过实现方法可以看出:move并未清除原有数据。但move比cpy更安全,在使用cpy的时候,一定要考虑区域重叠的问题,另外还要考虑缓冲区溢出的问题啊。
还要知道memncpy能确保缓冲区不溢出。但要根据你的情况,如果char *str_source=\"hello\", char buf[1024]的话,你用memcpy就可以了。用memncpy是没必要的。还可以用strcpy,更方便,毕竟已经确保不可能溢出了。