memcpy與memmove的區別

2021-10-11 07:50:49 字數 900 閱讀 1443

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的乙個子集。

在實際情況下,這兩個函式都是用彙編實現的。

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

memcpy與memmove的目的都是將n個位元組的源記憶體位址的內容拷貝到目標記憶體位址中。但當源記憶體和目標記憶體存在重疊時,memcpy會出現錯誤,而memmove能正確地實施拷貝,但這也增加了一點點開銷。memmove的處理措施 1 當源記憶體的首位址等於目標記憶體的首位址時,不進行任何拷貝...

memcpy與memmove的區別

我的試驗結果是2個函式的執行效果沒有區別.vc6sp6 winxp.同學查了資料說是和庫實現有關,那麼以後一律用memmove,不用memcpy了.include stdafx.h include include void fntest1 void fntest2 int main int argc...

memcpy 函式與memmove 函式

void memcpy void dest,const void src,size t n 函式說明 1 src 和 dest 所指的記憶體區域可能重疊,但是如果src 和 dest 所指的記憶體區域重疊,memcpy 函式並不能確保src所在重疊區域在被拷貝之前不被覆蓋,這種情況可以使用memmo...