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;
}