memcpy的使用方法總結

2021-09-06 21:31:24 字數 2899 閱讀 3833

1、memcpy 函式用於 把資源記憶體(src所指向的記憶體區域) 複製到目標記憶體(dest所指向的記憶體區域);拷貝多少個?有乙個size變數控制

拷貝的位元組數;

函式原型:void *memcpy(void *dest, void *src, unsigned int count);

使用方法:(1)能夠拷貝不論什麼型別的物件,由於函式的引數型別是void*(沒有定義型別指標),也就是說傳進去的實參能夠是int*,short*,char*等等,

可是由於函式拷貝的過程是乙個位元組乙個位元組的拷貝的,所以實際操作的時候要把void*強制轉化為char*,這樣在指標加的時候才會保證每次加乙個位元組,呵呵

函式原始碼實現:

void *memcpy1(void *desc,const void * src,size_t size)

unsigned char *desc1 = (unsigned char*)desc;

unsigned char *src1 = (unsigned char*)src;

while(size-- >0)

return desc;

}int _tmain(int argc, _tchar* argv)

;const char src[5] = "1234";

//printf(src);

memcpy1(dest,src,sizeof(src));

//*(dest+5) = '/0';

printf((char *)dest);

int m = -1;

return 0;

}注意事項:(1)void* 一定要返回乙個值(指標),這個和void不太一樣!

(2)首先要推斷指標的值不能為空,desc為空的話肯定不能拷貝記憶體空間,src為空相當於沒有拷貝;所以之間return掉;

(3)""空串是指內容為0,null是0,不是串;兩個不等價;

(4)int dest[2] = ;這是對int 型別的陣列初始化的方法;假設是char型別,就用char a[5] = "1234";  注意陣列下標要

多於實際看到的字元數,由於還有'/0'

(5)printf((char *)dest);這句話,是把 char 型別 src 傳到 int 型別的 dest的記憶體強制轉化成char型別,然後列印出來;

由於直接看int型別的dest是看不到裡面的內容的;由於有unsigned char *desc1 = (unsigned char*)desc;所以字元能夠傳

到dest裡面儲存起來,dest所指向的記憶體長度4個位元組,強制轉化為char 就是把四個位元組分成乙個乙個的位元組,這樣就能夠看到

乙個個字元了,假設定義成char dest[5] = "1234";就不用轉化;呵呵,表達起來真累人;

(6)memcpy1(dest,src,sizeof(src));注意裡面的sizeof(src),這個是包括字串的結束符'/0'的;所以不用操心printf(dest);

可是假設用memcpy1(dest,src,4);沒有'/0'就要*(dest+5) = '/0';這樣保證是乙個完整的字串;

(7)假設初始化的時候:

char dest[1024] = "12345666";//;

const char src[5] = "3333";

那麼拷貝的時候,假設用memcpy1(dest,src,sizeof(src));則printf(dest);出來是3333

假設memcpy1(dest,src,4);則printf(dest);出來是33335666;由於上面的sizeof(src),包括'/0',所以拷貝過去的字串以'/0'

結束,就僅僅有3333,而假設傳4個字元,'/0'是第五個字元,那就遇到dest[1024] 的'/0'結束,所以是33335666

字串的'/0'問題一定要注意啊!!!

實際應用:

unsigned char g_pdata[1024] = "";

dword g_dwoffset = 0;

bool packdatatoserver(const unsigned char *pdata, const unsigned int usize)

void main()

packdatatoserver()函式的作用是把每次的資源記憶體複製到目標記憶體裡面,並且是累加的拷貝;也就是後一次緊接著上一次的拷貝;

顯然用到了memcpy函式;

實現原理是用到了乙個全域性變數g_dwoffset 儲存之前拷貝的長度,最開始沒有想到這一點,結果每次拷貝都是一次性的,下一次拷貝把

上一次的沖掉了;所以用全域性變數記錄拷貝的長度;

第二個須要注意的是,拷貝的過程中注意不要改變目標指標的指向,即目標指標始終指向初始化的時候指向的位置;那麼怎麼實現累積拷貝呢?

就是用的指標偏移;第一次實現的時候,把g_pdata += usize;寫到了函式裡面,這樣寫是可以實現指標位移的目標,可是指標指向也發生改變;

另外:g_pdata += usize;也有報錯:left operand must be l-value,原因是:把位址賦值給乙個不可更改的指標!

比方:char   a[100];  

char   *p   =   new   char[10];  

a   =   p;   //這裡出錯,注意了:陣列的首位址也是乙個常量指標,指向固定不能亂改的~~

char   *   const   pp   =   new   char[1];  

pp   =   a;   //也錯  

所以既不能改變首位址,又要滿足累積賦值(就是賦值的時候要從賦過值的地方開始向下乙個記憶體塊賦值,想到指標加),所以想到把指標加寫到

函式引數裡面,這時就要充分了解memcpy的實現過程,裡面是乙個乙個字元的賦值的,想連續賦值,就要把指標指向連續的記憶體的首位址,所以,

真的非常不好表達,呵呵,就這樣了,一大推零散的知識。。。

memcpy與memset函式的使用方法

這個主要用於我個人的學習筆記,便於以後查詢,順便分享給大家。想必在用c的時候難免會與陣列,指標,記憶體這幾樣東西打交道,先以陣列為例,例如有乙個陣列int a 5 我們要將陣列a裡面的資料複製到陣列b中,一般剛剛接觸c語言的我們會怎麼做?我們一般會想到用迴圈來做吧 int i int a 5 b 5...

使用方法總結

變數賦值 name xiaoming 程式互動 name input 請輸入你的名字 sum int input 請輸入你的名字 變成數字型,和數字比較 type 查詢資料型別的方法 a 2 print a,type a 結果 123 格式化輸出 msg 是佔位符 s 數字型 bit length ...

git的使用方法總結

1.建立版本庫 git init 2.檢視狀態 git status 3.檢視日誌 git log 4.檢視分支 git branch 5.建立分支 git branch 分支名 6.切換分支 git checkout 分支名 7.提交更改 git commit 8.轉殖版本庫 git clone ...