memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:
void *memcpy(void *dst, const void *src, size_t count);
void *memmove(void *dst, const void *src, size_t count);
void *memcpy(void *dst, const void *src, size_t count);
void *memmove(void *dst, const void *src, size_t count);
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
具体实现代码:
void* my_memcpy(void* dest, const void* src, int size)
{
assert(NULL != dest&&NULL != src);
void* ret = dest;
while (size--)
{
*(char*)dest = *(char*)src;
((char*)dest)++;
((char*)src)++;
}
return (char*)ret;
}
//memmove
void* my_memmove(void* dest, void* src, int size)
{
assert(NULL != dest&&NULL != src);
char*ret = (char*)dest;
if (dest > src && (char*)dest < (char*)src)
{
while (size--)
{
*((char*)dest + size) = *((char*)src + size);
}
}
else
{
while (size--)
{
*(char*)dest = *(char*)src ;
((char*)dest)++;
((char*)src)++;
}
}
return ret;
}