結構體指標強制型別轉換

2021-04-17 12:15:00 字數 2425 閱讀 3279

這兩天整結構體指標強制型別轉換的問題,真好碰到乙個網友的乙個問題,我把這個問題例項化實現, 發現這個例項對弄清楚下面三個問題有很大幫助:

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 實現標頭檔案中定...