memcpy和memmove()都是C语言中的库函数,在头文件string.h中,做用是拷贝必定长度的内存的内容,函数原型以下:c++
void *my_memcpy(void *dest, const void *src,size_t count)ide
void *my_memmove(void *dest, const void * src, size_t count)函数
他们的做用是同样的,惟一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。spa
第一种状况下,拷贝重叠的区域不会出现问题,内容都可以正确的被拷贝。orm
第二种状况下,问题出如今右边的两个字节,这两个字节的原来的内容首先就被覆盖了,并且没有保存。因此接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。blog
实际上,memcpy只是memmove的一个子集。内存
memmove在copy两个有重叠区域的内存时能够保证copy的正确,而memcopy就不行了,但memcopy比ci
memmove的速度要快一些,如:get
char s[] = "1234567890";原型
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)与memmove(p2, p1, 5)的结果就多是不一样的,memmove()能够将p1的头5个字符"12345"正确拷贝至p2,而memcpy()的结果就不必定正确了。
关于memmove的实现:
void *my_memmove(void *dest, const void * src, size_t count)
{
char *pDest = (char *)dest;
char *pSrc = (char *)src;
assert(dest);
assert(src);
if ((pDest >= pSrc) && (pDest <= pSrc + count))
{
while (count--)
{
*(pDest + count) = *(pSrc + count);
}
}
else//不重叠
{
while (count--)
{
*pDest++ = *pSrc++;
}
}
return dest;
}
关于memcpy的实现:
void *my_memcpy(void *dest, const void *src,size_t count)
{
assert(dest);
assert(src);
char *pDest = (char*)dest;
char *pSrc = (char*)src;
if ((pDest >= pSrc) && (pDest <= pSrc + count))
{
while (count--)
{
*(pDest + count) = *(pSrc + count);
}
}
else
{
while (count--)
{
*pDest++ = *pSrc++;
}
}
return dest;
}