代码实现的关键在于内存区域是否有重合,但是实际研究不管是不是有重合,都会有以下情况
void * memmove(void * dst ,void* src,size_t n)
{
if(dst==nullptr||src==nullptr)
return nullptr;
char* pdst=char*(dst);
char* psrc=char*(src);
if(pdst==psrc)
{
return psrc;
}
else if(pdst<psrc||pdst>=psrc+n)
{
char* p1=pdst;
char* p2=psrc;
while(n>0)
{
*p1=*p2;
p1++;
p2++;
n--;
}
}
else
{
char* p1=pdst+n-1;
char*p2=psrc+n-1;
while(n>0)
{
*p1=*p2;
p1--;
p2--;
n--;
}
}
return dst;
}