程式設計實現memcpy()

2021-06-23 05:10:48 字數 1083 閱讀 8068

以下內容**:

面試中如問到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的實現,很不幸,我也吃過這個虧 這種題要是寫的一塌糊塗後面完全沒戲 所以還是得提前準備一下,不然就只能呵呵了...