以下內容**:
面試中如問到memcpy的實現,那就要小心了,這裡有陷阱。
先看下標準memcpy()的解釋:注意下面的注釋,對於位址重疊的情況,該函式的行為是未定義的。
事實上所說的陷阱也在於此,自己動手實現memcpy()時就需要考慮位址重疊的情況。
另外,標準庫也提供了位址重疊時的記憶體拷貝函式:memmove(),那麼為什麼還要考慮重寫memcpy()函式呢?因為memmove()函式的實現效率問題,該函式把源字串拷貝到臨時buf裡,然後再從臨時buf裡寫到目的位址,增加了一次不必要的開銷。
下面給出memcpy()的實現,為了與標準庫函式區分,我們實現其包裹函式:
[cpp]view plain
copy
"font-size:14px;"
>
void
*memcpy(
void
*dst,
const
void
*src,
size_t
size);
intmain(intargc,
char
*argv)
void
*memcpy(
void
*dst,
const
void
*src,
size_t
size)
if((src < dst) && (
char
*)src +size > (
char
*)dst)
// 自後向前拷貝
} else
} return
dst; }
使用memcpy()的結果: abcdehijk
使用memcpy()的結果: abcdehijk,//在vc6.0中仍然輸出abcdehijk,可能的原因就是:有的函式庫實現的memcpy函式考慮到了位址重疊,所以不會有錯,而另外一些函式庫並沒有考慮到。
可以看到標準庫函式的源字串在拷貝的過程中被汙染了。
memcpy函式實現
1.原型 void memcpy void dest,const void src,size t size 標頭檔案 include 功能 由src所指記憶體區域複製size個位元組到dest所指記憶體區域。memcpy 時就需要考慮位址 重疊的情況。2.記憶體布局情況 1 源位址和目的位址不重疊 ...
重新實現memcpy
dst被移動了,返回的是移動後的dst,而且void指標不存在自增操作,所以顯然是錯誤的 void memcpy1 void dst,const void src,unsigned int len 將指標轉換成char型別的,那麼在複製資料的時候就是乙個位元組乙個位元組的進行 void memcpy...
memcpy 函式實現
memcpy函式的作用 將由src指向位址為起始位址的連續n個位元組的資料複製到以dest指向位址為起始位址的空間內,函式返回乙個指向dest的指標。想必大多數人在面試時被要求寫 memcpy的實現,很不幸,我也吃過這個虧 這種題要是寫的一塌糊塗後面完全沒戲 所以還是得提前準備一下,不然就只能呵呵了...