memcpy和memmove都是C语言的库函数,在头文件string.h中,作用是内存拷贝,原型如下“
它们的作用都是内存拷贝,唯一的区别是,当内存发生局部重叠时,memmove保证了拷贝的结果是正确的,但是memcopy不一定是正确的。但是memcpy比memmove速度快。
memcpy
memcpy函数从src内存中拷贝了count字节到dest内存区域,但是src和dest的内存区域不能重叠。
memmove
memcpy函数从src内存中拷贝了count字节到dest内存区域,但是src和dest的内存区域可以重叠。
memcpy和memmove对比:
内存重叠区域有两种情况:
memcpy函数实现:
void *my_memcpy(void *dst,void *src,size_t n)
{
char *tmp = (char *)dst;
char *p = (char *)src;
while(n--)
{
*tmp++ = *p++;
}
return dst;
}
memcpy在第二种内存覆盖情况下,最终不会得到正确的结果,会有踩内存现象,第一种内存覆盖可以得到正确的结果。
memmove函数实现:
void *my_memmove(void *dst,void *src,size_t n)
{
char *p1 = (char *)dst;
char *p2 = (char *)src;
if(p1 > p2 && p2+n > p1)//对于第二种内存覆盖进行了讨论
{
p1 = p1+n-1;
p2 = p2+n-1;
while(n--)
{
*p1-- = *p2--;
}
}
else
{
while(n--)
{
*p1++ = *p2++;
}
}
return dst;
}
memmove针对第二种内存覆盖进行了改进,所以memmove能正常工作。