memmove 和 memcpy 的區別

2021-07-25 09:07:10 字數 1621 閱讀 5675

原文出處:

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不保證拷貝的結果的正確。

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

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

實際上,memcpy只是memmove的乙個子集。

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

memmove在copy兩個有重疊區域的記憶體時可以保證copy的正確,而memcopy就不行了,但memcopy比memmove的速度要快一些,如:

12

3

chars[

]="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()

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

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

用法:#include

功能:由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)

else

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

兩種方法的實現

void *mymemcpy(void *dest, const void *src, size_t n)

void *mymemmove(void *dest, const void *src, size_t n)

memmove 和 memcpy的區別

memcpy和memmove 都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,原型分別如下 void memcpy void dst,const void src,size t count void memmove void dst,const void src...

memcpy和memmove的區別

memcpy和memmove的區別 memcpy 和memmove 都是c語言中的庫函式,在標頭檔案string.h中,其原型分別如下 void memcpy void dst,const void src,size t count void memmove void dst,const void ...

memcpy和memmove的區別

memcpy和memmove的區別 memcpy 和memmove 都是c語言中的庫函式,在標頭檔案string.h中,其原型分別如下 void memcpy void dst,const void src,size t count void memmove void dst,const void ...