实现memcpy

作者: darkness605 | 来源:发表于2020-09-29 00:18 被阅读0次

    memcpy的函数原型:

    void *memcpy(void *dest, const void *src, size_t n);
    //dest 是要拷贝到的目标内存区域,src是被拷贝的内存区域,n是拷贝的字节长度。
    

    这里有个重要的问题就是,memcpy可能发生内存重叠。
    主要有以下两种内存重叠情况。

    image.png
    由于拷贝是从低地址开始,按字节进行拷贝的。
    在第一种内存重叠的情况下,可以不用进行特殊处理,因为dest<=src的时候,按字节拷贝,1、2、3拷贝完了以后,到4的时候,覆盖了src的1数值,其实已经不影响了,因为1已经拷贝完成了。
    可以归到正常情况,(char)dest>=(char)src+n的时候。
    第二种情况的话,当dest>src,并且dest<src+n的时候,就会出现问题。因为src中4的地址被dest拷贝1的时候已经覆盖了,那到了要拷贝src4的时候,就不再是4而是1了。
    根据以上可以得出代码
    void *memcpy(void *dest, const void *src,size_t n)
    {
    if(dest==nullptr||src==nullptr)
        return nullptr;
    void *res = dest;
    if(dest<=src||(char*)dest>=(char*)src+n){
            while(len--){
    //从低地址开始复制
            *(char*)dest =*(char*)src;
            dest=(char*)dest+1;
            src=(char*)src+1;
            }
    }
    else{
    //从高地址开始复制
          src = (char*)src + len -1;
          dst = (char*)dst + len -1;
          while(len--){
                *(char*)dst = *(char*)src;
                dst = (char*)dst -1;
                src = (char*)src -1;
              }
        }
    return res;
    }
    

    实际上:我们上面写出的改进版memcpy就是memove函数的实现方式。

    相关文章

      网友评论

        本文标题:实现memcpy

        本文链接:https://www.haomeiwen.com/subject/zcgyuktx.html