memcpy與memmove的區別

2021-07-07 03:15:10 字數 1529 閱讀 1400

我的試驗結果是2個函式的執行效果沒有區別. vc6sp6 + winxp.

同學查了資料說是和庫實現有關, 那麼以後一律用memmove, 不用memcpy了.

//#include "stdafx.h"

#include #include void fntest1();

void fntest2();

int main(int argc, char* argv)

void fntest1()

; char szbuf2[8] = ;

/// 當src首位址 > dst首位址時, memmove和memcpy效果是相同的, 且都正確

memmove(&szbuf[2], &szbuf[4], 4);

/**- szbuf 0x0109ff78 "01456767? .y.g"

[0x0] 0x30 '0'

[0x1] 0x31 '1'

[0x2] 0x34 '4'

[0x3] 0x35 '5'

[0x4] 0x36 '6'

[0x5] 0x37 '7'

[0x6] 0x36 '6'

[0x7] 0x37 '7'

*/memcpy(&szbuf2[2], &szbuf2[4], 4);

/**- szbuf2 0x0109ff70 "0145676701456767? .y.g"

[0x0] 0x30 '0'

[0x1] 0x31 '1'

[0x2] 0x34 '4'

[0x3] 0x35 '5'

[0x4] 0x36 '6'

[0x5] 0x37 '7'

[0x6] 0x36 '6'

[0x7] 0x37 '7'

*/}void fntest2()

; char szbuf2[8] = ;

/// 當src首位址 < dst首位址時, memmove和memcpy效果是相同的, 且都正確

memmove(&szbuf[4], &szbuf[2], 4);

/**- szbuf 0x0109ff24 "01232345€ .r.g"

[0x0] 0x30 '0'

[0x1] 0x31 '1'

[0x2] 0x32 '2'

[0x3] 0x33 '3'

[0x4] 0x32 '2'

[0x5] 0x33 '3'

[0x6] 0x34 '4'

[0x7] 0x35 '5'

*/memcpy(&szbuf2[4], &szbuf2[2], 4);

/**- szbuf2 0x0109ff1c "0123234501232345€ .r.g"

[0x0] 0x30 '0'

[0x1] 0x31 '1'

[0x2] 0x32 '2'

[0x3] 0x33 '3'

[0x4] 0x32 '2'

[0x5] 0x33 '3'

[0x6] 0x34 '4'

[0x7] 0x35 '5'*/}

memcpy與memmove 的區別

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

memcpy與memmove的區別

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

memcpy 函式與memmove 函式

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