您好,登錄后才能下訂單哦!
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;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。