实现memcpy
2020-09-29 本文已影响0人
darkness605
memcpy的函数原型:
void *memcpy(void *dest, const void *src, size_t n);
//dest 是要拷贝到的目标内存区域,src是被拷贝的内存区域,n是拷贝的字节长度。
这里有个重要的问题就是,memcpy可能发生内存重叠。
主要有以下两种内存重叠情况。
由于拷贝是从低地址开始,按字节进行拷贝的。
在第一种内存重叠的情况下,可以不用进行特殊处理,因为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函数的实现方式。