面试题目

实现memcpy

2020-09-29  本文已影响0人  darkness605

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函数的实现方式。

上一篇下一篇

猜你喜欢

热点阅读