1. 程式人生 > >關於sizeof函式、memcpy函式以及結構體關於指標的問題彙總

關於sizeof函式、memcpy函式以及結構體關於指標的問題彙總

1、sizeof()函式用於獲取變數、型別等位元組數。但是不能通過結構體指標獲取結構體的位元組數。使用會出現錯誤;

比如:

typede struct
{
   unsigned char yuliu[5];
   unsigned char port;
}_struct;

_struct *pinfo;

int length =sizeof(pinfo);  //得到指標的位元組數
int structLength =sizeof(_struct);//得到結構體的位元組數

其中length與structLength的位元組數是不一樣的,sizeof(pinfo)得到的只是指標的大小;sizeof(_struct)得到的才是結構體的大小

,如果不注意這個問題,在編寫程式碼時可能會出現錯誤;牢記!!!!!

2.memcpy()函式用於拷貝,還是關於指標的問題, 如下程式碼所示:

typede struct
{
   unsigned char yuliu[5];
   unsigned char port;
}_struct;

_struct *pinfo;//定製結構體指標變數

unsigned char tent; //定義普通變數

char *content=new char[];

//拷貝指標
memcpy(content,pinfo,sizeof(_struct));//向content中拷貝從地址為pinfo開始,
//位元組長度為sizeof(_struct),後面結構體_struct的資料;因為定義為*pinfo,那麼*pinfo的地址就為pinfo,所以不用再在前面加地址符&

memcpy(content,&tent,sizeof(unsigned char));//區分上面的語句,中間的變數tent加上了地址符&,因為是普通變數,必須加地址符。

 3.關於結構體,在C++定義結構體時,如果涉及到拷貝函式的使用,組幀資料時,最好在結構體的首尾加上#pragma pack(1),進行一位元組對其,否則可能會出現位元組數不對的情況;我在使用中發現,不加的話,本來結構體應該是16位元組,結果監測出資料長度為20位元組。此外一定注意#pragma pack(1)必須是成對存在,即後面要加上#prgram pack(),不然會出現莫名其妙的錯誤。例子如下:

#pragma pack(1)

typede struct
{
   unsigned char yuliu[5];
   unsigned char port;
}_struct;

#pragma pack()