日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于memcpy和memmove两函数的区别

發布時間:2023/11/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于memcpy和memmove两函数的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/caowei840701/article/details/8491836

[cpp]?view plain?copy
  • <p>??
  • 關于memcpy和memmove兩個c標準庫函數,其功能都是將一塊內存區域中的指定大小內容復制到目標內存中,在翻閱c標準庫實現的源代碼我們發現他們是有區別的。</p><p>首先看memcpy的實現:</p><p>?</p>??
  • [cpp]?view plain?copy
  • void?*?__cdecl?memcpy?(??
  • ????????void?*?dst,??
  • ????????const?void?*?src,??
  • ????????size_t?count??
  • ????????)??
  • {??
  • ????????void?*?ret?=?dst;??
  • ??
  • #if?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)??
  • ????????{??
  • ????????extern?void?RtlMoveMemory(?void?*,?const?void?*,?size_t?count?);??
  • ??
  • ????????RtlMoveMemory(?dst,?src,?count?);??
  • ????????}??
  • #else??/*?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)?*/??
  • ????????/*?
  • ?????????*?copy?from?lower?addresses?to?higher?addresses?
  • ?????????*/??
  • ????????while?(count--)?{??
  • ????????????????*(char?*)dst?=?*(char?*)src;??
  • ????????????????dst?=?(char?*)dst?+?1;??
  • ????????????????src?=?(char?*)src?+?1;??
  • ????????}??
  • #endif??/*?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)?*/??
  • ??
  • ????????return(ret);??
  • }??
  • 再看memmove的實現:

    [cpp]?view plain?copy
  • void?*?__cdecl?memmove?(??
  • ????????void?*?dst,??
  • ????????const?void?*?src,??
  • ????????size_t?count??
  • ????????)??
  • {??
  • ????????void?*?ret?=?dst;??
  • ??
  • #if?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)??
  • ????????{??
  • ????????extern?void?RtlMoveMemory(?void?*,?const?void?*,?size_t?count?);??
  • ??
  • ????????RtlMoveMemory(?dst,?src,?count?);??
  • ????????}??
  • #else??/*?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)?*/??
  • ????????if?(dst?<=?src?||?(char?*)dst?>=?((char?*)src?+?count))?{??
  • ????????????????/*?
  • ?????????????????*?Non-Overlapping?Buffers?
  • ?????????????????*?copy?from?lower?addresses?to?higher?addresses?
  • ?????????????????*/??
  • ????????????????while?(count--)?{??
  • ????????????????????????*(char?*)dst?=?*(char?*)src;??
  • ????????????????????????dst?=?(char?*)dst?+?1;??
  • ????????????????????????src?=?(char?*)src?+?1;??
  • ????????????????}??
  • ????????}??
  • ????????else?{??
  • ????????????????/*?
  • ?????????????????*?Overlapping?Buffers?
  • ?????????????????*?copy?from?higher?addresses?to?lower?addresses?
  • ?????????????????*/??
  • ????????????????dst?=?(char?*)dst?+?count?-?1;??
  • ????????????????src?=?(char?*)src?+?count?-?1;??
  • ??
  • ????????????????while?(count--)?{??
  • ????????????????????????*(char?*)dst?=?*(char?*)src;??
  • ????????????????????????dst?=?(char?*)dst?-?1;??
  • ????????????????????????src?=?(char?*)src?-?1;??
  • ????????????????}??
  • ????????}??
  • #endif??/*?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)?*/??
  • ??
  • ????????return(ret);??
  • }??

  • 仔細分析上面的代碼不難看出,memcpy只是簡單的將兩塊內存區域當作沒有關系的相互獨立內存區域進行內存的拷貝,而memmove則考慮了當兩塊內存區域有重疊時所采用不同方向的拷貝模式進行處理。

    如上圖所示,當源內存和目標內存出于第一種情況即兩塊內存區域相互獨立時,memcpy和memmove都是可以正確處理的。在第二種情況下,兩個函數都可以正常的實現內存拷貝。而當兩塊內存區域處于第三種情況時,很明顯memcpy的實現存在問題,當將源內存塊的開始字節拷貝到目標內存時,同時也會覆蓋源內存塊中的尚未拷貝的內存,導致從源內存在目標內存地址處開始的內存不能正確的拷貝。

    ?



    總結

    以上是生活随笔為你收集整理的关于memcpy和memmove两函数的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。