生活随笔
收集整理的這篇文章主要介紹了
memcpy和memmove的区别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
memcpy()和memmove()都是C語言中的庫函數(shù),在頭文件string.h中,其原型分別如下: ? | void?*memcpy(void?*dst,?const?void?*src,?size_t?count); void?*memmove(void?*dst,?const?void?*src,?size_t?count); |
? 它們都是從src所指向的內(nèi)存中復(fù)制count個字節(jié)到dst所指內(nèi)存中,并返回dst的值。當(dāng)源內(nèi)存區(qū)域和目標(biāo)內(nèi)存區(qū)域無交叉時,兩者的結(jié)果是一樣的,但如果有交叉呢?先看下圖: ?
圖的上半部分為源內(nèi)存區(qū)域在目標(biāo)內(nèi)存區(qū)域右邊,下半部分為源內(nèi)存區(qū)域在目標(biāo)區(qū)域左邊,源內(nèi)存區(qū)域和目標(biāo)內(nèi)存區(qū)域都有交叉。
memcpy()是從src的起始部分開始復(fù)制,所以雖然第一種情況下沒有問題,但如果遇到第二種情況,則會發(fā)生錯誤,如圖所示,后兩個字節(jié)在被復(fù)制前已經(jīng)被覆蓋掉了。而memmove()則由于采用了不同的復(fù)制機制,所以可以正確處理第二種情況。
VS.NET2003中所附源碼如下(有刪):
| void?*?__cdecl?memcpy?(void?*?dst,?const?void?*?src,?size_t?count) { ????????void?*?ret?=?dst; ???????? ????????while?(count--)?{ ????????????????*(char?*)dst?=?*(char?*)src; ????????????????dst?=?(char?*)dst?+?1; ????????????????src?=?(char?*)src?+?1; ????????} ????????return(ret); } |
| void?*?__cdecl?memmove?(void?*?dst,?const?void?*?src,?size_t?count) { ????????void?*?ret?=?dst; ????????if?(dst?<=?src?||?(char?*)dst?>=?((char?*)src?+?count))?{ ????????????????//從地位向高位 ????????????????while?(count--)?{ ????????????????????????*(char?*)dst?=?*(char?*)src; ????????????????????????dst?=?(char?*)dst?+?1; ????????????????????????src?=?(char?*)src?+?1; ????????????????} ????????} ????????else?{ ?//從高位向地位 ???????????????? ????????????????dst?=?(char?*)dst?+?count?-?1; ????????????????src?=?(char?*)src?+?count?-?1; ????????????????while?(count--)?{ ????????????????????????*(char?*)dst?=?*(char?*)src; ????????????????????????dst?=?(char?*)dst?-?1; ????????????????????????src?=?(char?*)src?-?1; ????????????????} ????????} ????????return(ret); } |
總結(jié)
以上是生活随笔為你收集整理的memcpy和memmove的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。