memcpy用法總結

2021-09-11 11:34:46 字數 4604 閱讀 1090

原型: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* ar**)

;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個位元組。

memcpy用來做記憶體拷貝,你可以拿它拷貝任何資料型別的物件,可以指定拷貝的資料長度;

例:char a[100], b[50];

memcpy(b, a,sizeof(b)); //注意如用sizeof(a),會造成b的記憶體位址溢位。

strcpy就只能拷貝字串了,它遇到'\0'就結束拷貝;例:

char a[100], b[50];

strcpy(a,b);

3.如果目標陣列destin本身已有資料,執行memcpy()後,將覆蓋原有資料(最多覆蓋n)。如果要追加資料,則每次執行memcpy後,要將目標陣列位址增加到你要追加資料的位址。

//注意,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函式用法

函式原型 void memcpy void dest,void src,unsigned int count memcpy 函式用於 把資源記憶體 src所指向的記憶體區域 拷貝到目標記憶體 dest所指向的記憶體區域 size變數控制拷貝的位元組數 用法 1 可以拷貝任何型別的物件,因為函式的引數...

memcpy函式用法

1 memcpy 函式用於 把資源記憶體 src所指向的記憶體區域 拷貝到目標記憶體 dest所指向的記憶體區域 拷貝多少個?有乙個size變數控制 拷貝的位元組數 函式原型 void memcpy void dest,void src,unsigned int count 用法 1 可以拷貝任何型...