memmove 和 memcpy的區別

2021-06-21 11:04:54 字數 1974 閱讀 5612

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的速度要快一些

,如: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()

#include #include int main()

else

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

return 0;

}

結果:

char found: goldenx.
關於memmove的實現:

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

關於memcpy的實現:

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

使用例項:

#include #include int main()

; char psz_src2[128] = ;

strcpy( psz_src1, "this is a test" );

strcpy( psz_src2, "this is a test" );

printf( "psz_src1: %s, psz_src2: %s\n", psz_src1, psz_src2 );

memcpy( psz_src1 + 4, psz_src1, 6 );

printf( "memcpy psz_src1: %s\n", psz_src1 );

memmove( psz_src2 + 4, psz_src2, 6 );

printf( "memmove psz_src2: %s\n", psz_src2 );

return 0;

}

結果:

psz_src1: this is a test, psz_src2: this is a test

memcpy psz_src1: thisthisthtest

memmove psz_src2: thisthis itest

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 ...