memcpy 函式實現

2021-09-11 03:07:15 字數 1484 閱讀 5317

memcpy函式的作用:

將由src指向位址為起始位址的連續n個位元組的資料複製到以dest指向位址為起始位址的空間內,函式返回乙個指向dest的指標。

想必大多數人在面試時被要求寫 memcpy的實現,很不幸,我也吃過這個虧(這種題要是寫的一塌糊塗後面完全沒戲),所以還是得提前準備一下,不然就只能呵呵了。

void * memcpy(void *dest, const void *src, unsigned int count);

特別說明:

1、與strcpy相比,memcpy遇到'\0'不會結束,而是一定要拷貝完n個位元組,所以要指定拷貝的資料長度

2、memcpy可以拷貝任何資料型別的物件,如果dest和src的指標型別不一樣,也需要處理,不能直接++使位址自增(例如: int* p和 char*q, p++指標的值是4個4個加(0,4,8),q++是1個1個加(0,1,2,3,4))

3、如果dest本身就有資料,執行memcpy()之後會覆蓋原有的資料,所以src和dest所指向的記憶體區域不能有重疊

4、不能改變形參的值,定義新的臨時變數來操作

5、引數提供的位址可能為空

完善後的**:

void *memcpy(void *dest, const void *src, size_t count)

char *tmp_dest = dest;

const char *tmp_src = src;

while (count--) *tmp_dest++ = *tmp_src++ ;

return dest;

}這樣寫的**語法上看起來沒什麼問題了,但是不要忘記 src和dest所指向的記憶體區域不能有重疊,所以上面這段**還是有bug。這個算是不容易看出來的bug,如果這樣寫了以後**出現問題就很難排除了,這也就是為什麼寫不好這個函式指定會被淘汰的原因了。

記憶體位址重疊的情況分為兩種,第一種是dest的位址在src位址的後面,另一種則是dest位址在src位址的前面。

這兩種情況在memcpy中都是不允許出現的,需要在**中處理以避免。

為了處理上面這兩種情況,後來又提供了另乙個函式memmove,在不需要保留原來記憶體區域的資料的時候可以使用memmove。

最終的正確的版本:

void *memcpy(void *dest, const void *src, size_t count)

char *tmp_dest = dest;

const char *tmp_src = src;

while (count--) *tmp_dest++ = *tmp_src++ ;

return dest;

}

上面就是正確的版本了,我所能考慮到的問題都處理了。

另外,這段**還可以優化,比如根據cpu的位元組長度,把原來乙個乙個位元組拷貝轉換為按cpu的長度拷貝,等等。

感興趣的話自己研究一下吧,這裡就不介紹了。

memcpy函式實現

1.原型 void memcpy void dest,const void src,size t size 標頭檔案 include 功能 由src所指記憶體區域複製size個位元組到dest所指記憶體區域。memcpy 時就需要考慮位址 重疊的情況。2.記憶體布局情況 1 源位址和目的位址不重疊 ...

memcpy函式的實現

前段時間去面試自己比較喜歡的乙個工作,面試的哥們讓我實現void memcpy void to,const void from,size t count 這個函式。沒做出來,掛了。感到非常不爽。回來研究了一下。找著了幾個不同版的實現,貼出來。首先對這個函式做一些說明。include void mem...

memcpy的函式內部實現

memcpy和memmove函式的實現,需要注意memmove的覆蓋問題,還有指標型別需要考慮。下面的例子中,先給出了錯誤的例子,而後給出了正確的例子,引以為戒!區別 兩個函式都是進行n位元組記憶體內容的拷貝,入口引數和返回引數也都一樣,可是這兩個函式在內部實現上是有一定區別的,這主要是因為dest...