有如下結構體定義:
typedef struct cemsg
cemsg;
typedef struct msgmsg;
typedef struct msg_pmsg_p;
void ap_getmsg(msg *d_osmsgptr,cemsg *d_cemsgptr)
注:其中cpy(dest,src,n)函式的功能是把src開始的n byte資料copy到dest開始的資料區域內。
在**除錯中:
位址d_osmsgptr---0x00ffb21c ; d_osmsgptr->byte[4]---0x00ffb21e
值d_osmsgptr->id==0x0c;d_osmsgptr->cmd == 0x11; d_osmsgptr->byte[0]==0xd4;d_osmsgptr->byte[1]==0xd0;d_osmsgptr->byte[2]==0xff;d_osmsgptr->byte[3]==0x00;
當函式執行完d_p = ( msg_p * )d_osmsgptr;這句時:
位址d_p---0x00ffb21c ; d_p->ptr---0x00ffd0d4
值d_p->id==0x0c;d_p->cmd == 0x11; *d_p->ptr==0x06;
請問:1:在對d_osmsgptr強制轉換為msg_p型別時,具體的執行過程時怎樣的,為什麼轉換之後,d_p的位址為d_osmsgptr的0x00ffb21c,d_p->ptr的位址卻不是d_osmsgptr- >byte[4]的位址。
2:轉換完畢之後,d_p->ptr應該是指向d_osmsgptr->byte的指標,但是為什麼*d_p->ptr的值不是d_osmsgptr->byte[0],0x06又是從何而來呢?
3:( cemsg far* )d_p->ptr 這句,cemsg是乙個結構體型別,d_p->ptr是乙個指向乙個陣列的指標型別,並且是乙個結構體的資料項,這樣的型別轉換,又是如何操作的呢?
答:1、指標強制型別轉換實際上就是用新的指標型別來解析原來位址空間中的內容
比如d_osmsgptr原來空間的內容是
(struct msg_p)
1byte 1byte 4bytes
id cmd byte[4]
強制型別轉換之後,就要以struct msg_p來解析該內容
一共6bytes
1byte 1byte 4bytes
id cmd ptr
原來byte[4]的內容成為ptr的內容,而不是byte[4]的首位址.
*****注意強制轉換後,是用新的結構體來解析原來空間的內容
所以強制轉換後的結構體內的指標把原來空間的內容當作自己的內容,而不是指向原來空間的位址
所以&(d_p->ptr)才是d_osmsgptr->byte的首位址
同樣在進行( cemsg far* )d_p->ptr 轉換後
&(d_p->ptr)才是uchar data[10];的首位址
而且有乙個問題,結構體的長度不一致,進行強制型別轉換後,可能出現記憶體訪問越界
2、由於d_p->ptr內存放的值是0x00ffd0d4,所以
*d_p->ptr的值實際上是記憶體中(0x00ffd0d4)單元中存放的內容
3、首先d_p->ptr 所指向的位址並不是你預想中所指的位址,所以對它進行強制型別轉換,結果未知.(絕對是不安全的)
4、與結構體長度無關,實際上,你幸好沒有做*d_p->ptr = ***(賦值)操作
否則,將對0x00ffd0d4位址的內容進行操作,這並不是合法的操作.
結構體型別強制轉換
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等型別一樣,都是資料型別。其他型別怎麼轉換,結構體就怎麼轉換,沒有什麼特殊的地方。樓主可能想知道的不是結構體怎樣強制轉換這個問題吧,猜測,樓主想知道如下幾個問題 如果將乙個結構體強制型別轉換為另乙個結構體 或者型別 那這個結構體的成員會怎樣了?如果將乙個結構體強制型別轉換為...
結構體指標強制型別轉換
這兩天整結構體指標強制型別轉換的問題,真好碰到乙個的乙個問題,我把這個問題例項化實現,發現這個例項對弄清楚下面三個問題有很大幫助 1,結構體指標強制型別轉換的問題 2,char字元cout輸出的問題 3,結構體資料對齊的問題 具體下面的例項有分析 include using namespace st...