天天看點

memmove 和 memcpy的差別

memcpy和memmove()都是C語言中的庫函數,在頭檔案string.h中,作用是拷貝一定長度的記憶體的内容,原型分别如下:

void *memcpy(void *dst, const void *src, size_t count);

void *memmove(void *dst, const void *src, size_t count); 

他們的作用是一樣的,唯一的差別是,當記憶體發生局部重疊的時候,memmove保證拷貝的結果是正确的,memcpy不保證拷貝的結果的正确。

memmove 和 memcpy的差別

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

第二種情況下,問題出現在右邊的兩個位元組,這兩個位元組的原來的内容首先就被覆寫了,而且沒有儲存。是以接下來拷貝的時候,拷貝的是已經被覆寫的内容,顯然這是有問題的。

實際上,memcpy隻是memmove的一個子集。

二者的c語言實作很簡單,有興趣的朋友可以去看看。在實際情況下,這兩個函數都是用彙編實作的。

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()的結果就不一定正确了

memcpy()、 memmove()和memccpy()

-------------------------------------------------------

    這三個函數的功能均是将某個記憶體塊複制到另一個記憶體塊。前兩個函數的差別在于它們處理記憶體區域重疊(overlapping)的方式不同。第三個函數的功能也是複制記憶體,但是如果遇到某個特定值時立即停止複制。

    對于庫函數來說,由于沒有辦法知道傳遞給他的記憶體區域的情況,是以應該使用memmove()函數。通過這個函數,可以保證不會出現任何記憶體塊重疊問題。而對于應用程式來說,因為代碼“知道”兩個記憶體塊不會重疊,是以可以安全地使用memcpy()函數。

原型:extern void *memccpy(void *dest, void *src, unsigned char ch, unsigned int count);

用法:#include <string.h>

功能:由src所指記憶體區域複制不多于count個位元組到dest所指記憶體區域,如果遇到字元ch則停止複制。

說明:傳回指向字元ch後的第一個字元的指針,如果src前n個位元組中不存在ch則傳回NULL。ch被複制。

char s[]="Goldenx Global View";

char d[20];

char *p;

p=(char *)memccpy(d,s,'x',strlen(s));

if(p)

{

   *p='\0'; // MUST Do This

   printf("Char found: %s.\n",d);

}

else

   printf("Char not found.\n");

關于memmove的實作:

<a></a>

關于memcpy的實作:

注:兩者皆為彙編實作,上面代碼僅供友善了解兩者差別,

本文轉自 jiu~ 部落格園部落格,原文連結:http://www.cnblogs.com/jiu0821/p/7172172.html,如需轉載請自行聯系原作者

繼續閱讀