先来看一下两个库函数的区别:
1.当source和dest在内存中没有重叠区域时,两个库函数的作用是一样的。
2.当source和dest在内存中有重叠区域时,memcpy()的结果不正确。而memmove()则考虑到了这种情况。因此memmove()是正确的。
3.memmove的处理措施:
(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝
memcpy()和memmove()的实现:
void my_memcpy(void* dest,void* source,int count)
{
char *ret=(char *)dest;
char *dst=ret;
char *src=(char *)source;
while(count--)
{
*dst++=*src++;
}
return ret;
}
void my_memcpy(void* dest,void* source,int count)
{
char *ret=(char *)dest;
char *dst;
char *src;
if((char *)dest<=(char *source) || (char *)dest>=(char *)source+count)
{
dst=(char *)dest;
src=(char *)source;
while(count--)
*dst++=*src++;
}
else
{
dst=(char *)dest+count-1;
src=(char *)source+count-1;
while(count--)
{
*dst--=*src--;
}
}
return ret;
}