原型:extern void *memcpy(void *dest, void *src, unsigned int count);用法:#include 功能:由src所指記憶體區域複製count個位元組到dest所指記憶體區域。
說明:src和dest所指記憶體區域不能重疊,函式返回指向dest的指標。
舉例:// memcpy.c
#include #include main()
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的實現過程,裡面是乙個乙個字元的賦值的,想連續賦值,就要把指標指向連續的記憶體的首位址,所以,
真的很不好表達,呵呵,就這樣了,一大推零散的知識。。。
函式原型
void *memcpy(void*dest, const void *src, size_t n);
功能
由src指向位址為起始位址的連續n個位元組的資料複製到以destin指向位址為起始位址的空間內。
標頭檔案
#include
返回值
函式返回乙個指向dest的指標。
說明
1.source和destin所指記憶體區域不能重疊,函式返回指向destin的指標。
2.與strcpy相比,memcpy並不是遇到'\0'就結束,而是一定會拷貝完n個位元組。
3.如果目標陣列destin本身已有資料,執行memcpy()後,將覆蓋原有資料(最多覆蓋n)。如果要追加資料,則每次執行memcpy後,要將目標陣列位址增加到你要追加資料的位址。memcpy用來做記憶體拷貝,你可以拿它拷貝任何資料型別的物件,可以指定拷貝的資料長度;
例:char a[100], b[50];
memcpy(b, a,sizeof(b)); //注意如用sizeof(a),會造成b的記憶體位址溢位。
strcpy就只能拷貝字串了,它遇到'\0'就結束拷貝;例:
char a[100], b[50];
strcpy(a,b);
//注意,source和destin都不一定是陣列,任意的可讀寫的空間均可。
程式例
example1
作用:將s中的字串複製到字元陣列d中。
#include
#include
intmain()
輸出結果:goldenglobal view
example2
作用:將s中第14個字元開始的4個連續字元複製到d中。(從0開始)
#include
intmain()
輸出結果: view
example3
作用:複製後覆蓋原有部分資料
#include
#include
intmain(void)
輸出結果:
destinationbefore memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
destinationafter memcpy: ******************************as6
memcpy用法總結
原型 extern void memcpy void dest,void src,unsigned int count 用法 include 功能 由src所指記憶體區域複製count個位元組到dest所指記憶體區域。說明 src和dest所指記憶體區域不能重疊,函式返回指向dest的指標。舉例 m...
memcpy函式的用法
memcpy函式的用法 memcpy 的函式原型是void memcpy void dest,const void src,size t n 其功能是從源 src所指的記憶體位址的起始位置開始拷貝n個位元組到目標dest所指的記憶體位址的起始位置中。原型 extern void memcpy voi...
memcpy函式用法
函式原型 void memcpy void dest,void src,unsigned int count memcpy 函式用於 把資源記憶體 src所指向的記憶體區域 拷貝到目標記憶體 dest所指向的記憶體區域 size變數控制拷貝的位元組數 用法 1 可以拷貝任何型別的物件,因為函式的引數...