溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

memcpy和memmove的區別

發布時間:2020-05-26 05:03:47 來源:網絡 閱讀:639 作者:I慕藍 欄目:編程語言

   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的區別

第一種情況下,拷貝重疊的區域不會出現問題,內容均可以正確的被拷貝。

第二種情況下,問題出現在右邊的兩個字節,這兩個字節的原來的內容首先就被覆蓋了,而且沒有保存。所以接下來拷貝的時候,拷貝的是已經被覆蓋的內容,顯然這是有問題的。

實際上,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;

}


 





向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女