關於sizeof函式、memcpy函式以及結構體關於指標的問題彙總
阿新 • • 發佈:2018-12-09
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()