memcpy和memmove的区别

   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



wKioL1ctX5ShtOSDAAAtH5SqrCo639.png

第一种状况下,拷贝重叠的区域不会出现问题,内容都可以正确的被拷贝。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;

}

相关文章
相关标签/搜索