關于memcpy和memmove兩函數的區別

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

[cpp]?view plain?copy
  1. <p>??
  2. 關于memcpy和memmove兩個c標準庫函數,其功能都是將一塊內存區域中的指定大小內容復制到目標內存中,在翻閱c標準庫實現的源代碼我們發現他們是有區別的。</p><p>首先看memcpy的實現:</p><p>?</p>??
[cpp]?view plain?copy
  1. void?*?__cdecl?memcpy?(??
  2. ????????void?*?dst,??
  3. ????????const?void?*?src,??
  4. ????????size_t?count??
  5. ????????)??
  6. {??
  7. ????????void?*?ret?=?dst;??
  8. ??
  9. #if?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)??
  10. ????????{??
  11. ????????extern?void?RtlMoveMemory(?void?*,?const?void?*,?size_t?count?);??
  12. ??
  13. ????????RtlMoveMemory(?dst,?src,?count?);??
  14. ????????}??
  15. #else??/*?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)?*/??
  16. ????????/*?
  17. ?????????*?copy?from?lower?addresses?to?higher?addresses?
  18. ?????????*/??
  19. ????????while?(count--)?{??
  20. ????????????????*(char?*)dst?=?*(char?*)src;??
  21. ????????????????dst?=?(char?*)dst?+?1;??
  22. ????????????????src?=?(char?*)src?+?1;??
  23. ????????}??
  24. #endif??/*?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)?*/??
  25. ??
  26. ????????return(ret);??
  27. }??

再看memmove的實現:

[cpp]?view plain?copy
  1. void?*?__cdecl?memmove?(??
  2. ????????void?*?dst,??
  3. ????????const?void?*?src,??
  4. ????????size_t?count??
  5. ????????)??
  6. {??
  7. ????????void?*?ret?=?dst;??
  8. ??
  9. #if?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)??
  10. ????????{??
  11. ????????extern?void?RtlMoveMemory(?void?*,?const?void?*,?size_t?count?);??
  12. ??
  13. ????????RtlMoveMemory(?dst,?src,?count?);??
  14. ????????}??
  15. #else??/*?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)?*/??
  16. ????????if?(dst?<=?src?||?(char?*)dst?>=?((char?*)src?+?count))?{??
  17. ????????????????/*?
  18. ?????????????????*?Non-Overlapping?Buffers?
  19. ?????????????????*?copy?from?lower?addresses?to?higher?addresses?
  20. ?????????????????*/??
  21. ????????????????while?(count--)?{??
  22. ????????????????????????*(char?*)dst?=?*(char?*)src;??
  23. ????????????????????????dst?=?(char?*)dst?+?1;??
  24. ????????????????????????src?=?(char?*)src?+?1;??
  25. ????????????????}??
  26. ????????}??
  27. ????????else?{??
  28. ????????????????/*?
  29. ?????????????????*?Overlapping?Buffers?
  30. ?????????????????*?copy?from?higher?addresses?to?lower?addresses?
  31. ?????????????????*/??
  32. ????????????????dst?=?(char?*)dst?+?count?-?1;??
  33. ????????????????src?=?(char?*)src?+?count?-?1;??
  34. ??
  35. ????????????????while?(count--)?{??
  36. ????????????????????????*(char?*)dst?=?*(char?*)src;??
  37. ????????????????????????dst?=?(char?*)dst?-?1;??
  38. ????????????????????????src?=?(char?*)src?-?1;??
  39. ????????????????}??
  40. ????????}??
  41. #endif??/*?defined?(_M_MRX000)?||?defined?(_M_ALPHA)?||?defined?(_M_PPC)?*/??
  42. ??
  43. ????????return(ret);??
  44. }??


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

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

?



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384052.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384052.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384052.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

判斷字符串出棧合法性

先來看說一下思路 接下來就是寫代碼了 int StackOrder(SeqStack* stack, char* input, char* output, int size_input, int size_output) {if(stack NULL || input NULL || output NULL){return 0;}int i_input 0;int j_output 0;SeqStackType value;for(; j_output <…

CodeForces - 1200C——小模擬

【題目描述】 Amugae is in a very large round corridor. The corridor consists of two areas. The inner area is equally divided by n sectors, and the outer area is equally divided by m sectors. A wall exists between each pair of sectors of same area (inner o…

1 單例模式

達內 閔大神 //餓漢單例模式 #include <iostream> using namespace std;class Singleton { public:static Singleton& getInstance(){return s_instance;} private:Singleton(){}Singleton(const Singleton& that){}static Singleton s_instance;//靜態成員變量 …

共享棧

1.定義 所謂共享棧就是利用一個數組實現兩個棧. 先來看一下共享棧的數據結構 typedef struct SharedStack {int top1;int top2;SeqStackType* data; }SharedStack; 2. 初始化 void SharedStackInit(SharedStack* stack) {if(stack NULL){return;//非法輸入}stack -> top…

BZOJ1018 | SHOI2008-堵塞的交通traffic——線段樹維護區間連通性+細節

【題目描述】 BZOJ1018 | SHOI2008-堵塞的交通traffic 有一天&#xff0c;由于某種穿越現象作用&#xff0c;你來到了傳說中的小人國。小人國的布局非常奇特&#xff0c;整個國家的交通系統可 以被看成是一個2行C列的矩形網格&#xff0c;網格上的每個點代表一個城市&#xff0…

C++ 函數隱藏

C該函數隱藏 只有基類成員函數的定義已聲明virtualkeyword&#xff0c;當在派生類中的時間&#xff0c;以支付功能實現&#xff0c;virtualkeyword可以從時間被添加以增加。它不影響多狀態。 easy混淆視聽&#xff0c;掩蓋&#xff1a; &#xff0c;規則例如以下&#xff1a; …

迷宮求解(遞歸)

首先來看一下迷宮簡易圖 ???????????????????????????? ????我們用 0 來表示該位置是墻, 用 1 來表示該位置是路. 所以, 我們在處理迷宮問題的時候可以將其看成一個二維數組即可, 而對應的每一條路我們可以用坐標的形式將其表示, 所以還需要…

CodeForces - 786C——二分+模擬?

【題目描述】 Rick and Morty want to find MR. PBH and they cant do it alone. So they need of Mr. Meeseeks. They Have generated n Mr. Meeseeks, standing in a line numbered from 1 to n. Each of them has his own color. i-th Mr. Meeseeks color is ai.Rick and M…

迷宮求解(非遞歸)

上篇文章寫出了利用函數形成棧楨的特性完成迷宮求解問題, 本篇文章我們自己手動維護一個棧, 其進行出棧, 入棧, 取棧頂元素, 來完成迷宮求解尋路的過程 ????思路和以前一樣, 首先, 我們先定義一個棧, 對其初始化, 同時, 定義一個迷宮地圖, 對該地圖進行初始化, 先判斷當前…

數據結構練習——雙向鏈表

http://www.cnblogs.com/-Lei/archive/2012/04/10/2440399.html 復習一下數據結構。。。。說不準下個星期就用上了 只不過寫的很簡單&#xff0c;沒有封裝 DoubleLinkList.h #ifndef GUARD_DoubleLinkList_h #define GUARD_DoubleLinkList_h#include <stdio.h>struct Li…

CodeChef - DGCD——樹鏈剖分+差分

【題目描述】 Youre given a tree on N vertices. Each vertex has a positive integer written on it, number on the ith vertex being vi. Your program must process two types of queries :1. Find query represented by F u v : Find out gcd of all numbers on the uniq…

UVa272-TeX中的引號

【題目描述】 傳送門 【題目分析】 今天開始刷紫書的題目啦 這道題很簡單&#xff0c;需要注意的是cgetchar()需要加上括號&#xff0c;因為賦值語句的優先級比判等低 而且書中說好像最好用整型變量&#xff0c;因為EOF的值為-1&#xff0c;在字符變量中沒有這個值。&#xf…

C++中友元(友元函數和友元類)的用法和功能

http://blog.csdn.net/adriano119/article/details/5914443/ 采用類的機制后實現了數據的隱藏與封裝&#xff0c;類的數據成員一般定義為私有成員&#xff0c;成員函數一般定義為公有的&#xff0c;依此提供類與外界間的通信接口。但是&#xff0c;有時需要定義一些函數&#x…

線程的終止分離

1.線程的終止 注意該函數是針對用戶級別的, 其中 retal 必須指向一個全局變量, 或者是一個 malloc 分配的, 因為如果是線程的局部變量, 當該線程退出時, 其他線程不能得到這個變量, 因為線程的局部變量各自私有 2. 現成的取消 其中thread是線程的 tid 3.線程的等待與分離 (1)…

UVa10082

【題目描述】 傳送門 【題目分析】 同樣是一道模擬&#xff0c;但是如何巧妙快速的解決仍然不簡單。通過這道題告訴我們對于復雜確定的對應關系我們要靈活運用常量數組。 同時還需要注意的一個小問題就是字符串數組中的"//"指的是轉義后的單斜杠&#xff0c;如果只…

C語言中的深拷貝和淺拷貝

http://www.cnblogs.com/zhanggaofeng/p/5421804.html C語言中的深拷貝和淺拷貝 //C語言中的深拷貝和淺拷貝 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>typedef struct _student{char name[30];char *title;…

死鎖的產生和避免

1.死鎖產生的四個必要條件 (1)互斥條件&#xff1a;資源是獨占的且排他使用&#xff0c;進程互斥使用資源&#xff0c;即任意時刻一個資源只能給一個進程使用&#xff0c;其他進程若申請一個資源&#xff0c;而該資源被另一進程占有時&#xff0c;則申請者等待直到資源被占有者…

UVa401

【題目描述】 傳送門 【題目描述】 嘻嘻&#xff0c;自己做直接AC還是比較開心的。當然有一部分原因是之前看書的時候詳細看過這個題的代碼&#xff0c;但是這已經快一年了&#xff0c;應該說做出這道題憑借的是自己的能力吧。回過身去看了一下書中的代碼發現自己寫的不算復…

gethostbyname() 函數說明

https://www.cnblogs.com/cxz2009/archive/2010/11/19/1881611.html gethostbyname()函數說明——用域名或主機名獲取IP地址 包含頭文件#include <netdb.h>#include <sys/socket.h>函數原型struct hostent *gethostbyname(const char *name);這個函數的傳入值是域…

求解迷宮最短路徑

1. 多通路迷宮初始化 先構建一個多通路迷宮,并且對其初始化 void MazeInitShortPath(Maze* maze) {if(maze NULL){return;}int row 0;int col 0;for(; row < MAX_COL; row){for(col 0; col < MAX_COL; col){maze -> map[row][col] Map[row][col];}printf("…