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;

}

相關文章
相關標籤/搜索