今天看到書上降到memcpy和memmove的區別才突然
發現原來兩者之間有如此區別,以前只知道這兩個函式是
實現同樣的功能,沒有接觸到其不同。
memcpy和memmove在msdn的定義如下:
從兩者的宣告來看的確沒有區別,我們來看這樣乙個例子
當我們需要將char* src="abcde"這個字串全部copy到dest中
然而src與dest在記憶體中大概是這樣存在的:
記憶體位址 低------>高
1src位址為記憶體1,目的位址為記憶體2src dest21
2345
63 [ a ][ b ][ c ][ d ][ e ][ '
\0' ][ ][ ][ ][ ][ ][ ][ ]
此時很明顯記憶體出現了重疊,當我們拷貝字元a到第三個記憶體位置的時
a將覆蓋src記憶體中的第三個字元 這種情況在memcpy未定義然而memmove
卻給出了正確的處理方式
解決方法,試想當我們先將dest位址移動dest+n-1同時src位址移動src+n-1
這樣再從src的最後乙個元素開
始逐個向前拷貝到dest中就完美的避免了記憶體
重疊導致的元素覆蓋問題呢
下面我們根據memcpy和memmove給出自己的實現:
1 #include 2執行截圖:using
namespace
std;34
void *memcopy( void *dest, const
void *src, size_t count )518
19return
dest;20}
2122
void *memmove(void *dest,const
void *src,size_t count )
2338}39
else
4049}50
5152
53return
dest;54}
5556
5758
void
main()
59
關於memcpy函式
一朋友問我memcpy如何寫?初時感到愕然,c庫中不是有嗎?後來才知道原來是某公司考題。檢視了一下要求,呵呵,要求的已經不是原來的memcpy函式了。嘗試寫出,歡迎高手拍磚 define n 4 pragma pack n void memcpyy void dest,const void src,...
關於memcpy 的實現
關於memcpy的實現很多同學可能一開始有和我一樣的想法,就是將src的內容乙個位元組乙個位元組的複製到dest中。這樣實現方法未嘗不可,但是我們都知道cpu每次取存記憶體中的資料時,是按照位址匯流排大小來訪問的。以32位的cpu為例子,cpu每次訪問資料都是一次4個位元組 32位 為最小單位訪問的...
strcpy strncpy和memcpy的區別
strcpy和 memcpy 都是標準 c庫函式,它們有下面的特點。strcpy和 memcpy 主要有以下 3方面的區別。1 複製的內容不同。strcpy 只能複製字串,而 memcpy 可以複製任意內容,例如字元陣列 整型 結構體 類等。2 複製的方法不同。strcpy 不需要指定長度,它遇到被...