這兩天整結構體指標強制型別轉換的問題,真好碰到乙個網友的乙個問題,我把這個問題例項化實現, 發現這個例項對弄清楚下面三個問題有很大幫助:
1,結構體指標強制型別轉換的問題
2,char字元cout輸出的問題
3,結構體資料對齊的問題 具體下面的例項有分析
#include
using namespace std;
#pragma pack(1)
typedef struct msg msg;
typedef struct cemsg cemsg;
typedef struct msg_p msg_p;
int main() };
msg* d_o**sgptr = &msgtemp; msg_p* d_p;
/*cemsg和msg都是陣列,資料對齊沒有空缺,轉換沒有問題
cemsg* d_p;
d_p = (cemsg*) d_o**sgptr; */
cout << "size of msg : " << sizeof(msg)
<< "size of cemsg : " << sizeof(cemsg) << "--" << sizeof(unsigned char*)
<< "size of msg_p : " << sizeof(msg_p) << endl;
cout << "msgtemp : " << " id = " << msgtemp.id
<< " cmd = " << msgtemp.cmd
<< " byte = " << msgtemp.byte << endl;
cout << "d_o**sgptr : " << d_o**sgptr->id
<< d_o**sgptr->cmd << d_o**sgptr->byte << endl;
cout << "d_o**sgptr's addr of byte" ;
addr = &d_o**sgptr->byte[0];
cout << " byte[0] : " << addr ;
addr = &d_o**sgptr->byte[1];
cout << " byte[1] : " << addr ;
addr = &d_o**sgptr->byte[2];
cout << " byte[2] : " << addr ;
addr = &d_o**sgptr->byte[3];
cout << " byte[3] : " << addr << endl;
d_p = (msg_p*) d_o**sgptr;
cout << "d_p : " << d_p->id << d_p->cmd << endl;
addr = &(d_p->ptr);//指向byte[3]的位址
1,d_p->ptr本身的位址對應byte的位址,而byte中的值才是ptr指向的位址
2,而此處並不是&(d_p->ptr)並不是完全對應byte的位址,而是有兩個偏移
這是由於結構體的資料對齊的原因,sizeof(msg)是6,sizeof(msg_p)則
是8,msg_p的結構體裡有2個byte的空缺
*d_o**sgptr* ----> *id ** id ** <----*d_p*
************ *cmd ** cmd ** *****
*byte[0] ** **
*byte[1] ** **
*byte[2] **ptr **
msg *byte[3] ** **
** ** msg_p
指標型別轉換圖
cout << "d_p addr of byte" << "the addr of &(d_p->ptr) : " << addr << endl;
//ptr的內容,即ptr指向目標位址值,此處為byte[2]和byte[3]和兩個未知byte的值,
//按位址格式輸出(4321)
addr = d_p->ptr; cout << "the addr of d_p->ptr : " << addr << endl;
addr = &d_p->ptr[0];//為上述ptr指向目標值,也是未知值
cout << "the addr of d_p->ptr[0] :" << addr << endl;
return 0;
//證明是由於資料對齊引起轉換偏移的,可以加#pragma pack(1),使之不偏移
結構體型別強制轉換
include include include int p t typedef struct chann s chann t typedef struct mpoachann s mpoachann t void main chann t p chann t p1 mpoachann t q mpo...
結構體強制型別轉換
在c語言中,結構體和int等型別一樣,都是資料型別。其他型別怎麼轉換,結構體就怎麼轉換,沒有什麼特殊的地方。樓主可能想知道的不是結構體怎樣強制轉換這個問題吧,猜測,樓主想知道如下幾個問題 如果將乙個結構體強制型別轉換為另乙個結構體 或者型別 那這個結構體的成員會怎樣了?如果將乙個結構體強制型別轉換為...
C語言 結構體指標強制轉換
最近寫c程式遇到的結構體指標強轉的坑,記錄一下.是乙個簡單的選單程式,程式用到鍊錶,表中儲存了9個不同命令.每次將使用者輸入的命令與表中儲存的命令名作對比 遍歷查詢 然後執行相應功能.總體結構 linktable.h 定義通用模組化鍊錶資料結構,以及相關操作 linktable.c 實現標頭檔案中定...