您的位置:首页 > 其它

memcpy和memmove的区别

2016-05-07 11:54 369 查看
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,函数原型如下:
void *my_memcpy(void *dest, const void *src,size_t count)
void *my_memmove(void *dest, const void * src, size_t count)
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。





第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。
memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比
memmove的速度要快一些,如:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息