结构体之间的转换
看code的过程中,经常看到将一个结构(a)体强制转换为另一结构体类型(b)后,赋给结构体(b)的变量。不
明白其中奥秘,忍了好久终于忍不住编了一小段程序测试一下。如下:
#include<iostream.h>#include <stdio.h>#include <stdlib.h>typedef struct chann_s
{ int num1; int num2;}chann_t; typedef struct mpoaChann_s{ chann_t chan; int num3; int num4;}mpoaChann_t;void main()
{ chann_t p; chann_t *p1; mpoaChann_t q; mpoaChann_t *q1; p.num1=1; p.num2=2; q.num3=3; q.num4=4; p1=&p; q1=&q; q1=(mpoaChann_t *)p1;//注意这条语句 cout<<q1->chan.num1<<endl; cout<<q1->chan.num2<<endl; cout<<q1->num3<<endl; cout<<q1->num4<<endl; }输出结果
121310656 4208553将q1=(mpoaChann_t *)p1;改为:q1->chan =p;输出结果:1234若将结构体mpoaChann_t定义为:
typedef struct mpoaChann_s{ int num3; chann_t chan; int num4;}mpoaChann_t;结构体chann_t不变,main()如下:void main(){ chann_t p; chann_t *p1; mpoaChann_t q; mpoaChann_t *q1; p.num1=1; p.num2=2; q.num3=3; q.num4=4; p1=&p; q1=&q; q1=(mpoaChann_t *)p1;//注意这条语句 cout<<q1->chan.num1<<endl; cout<<q1->chan.num2<<endl; cout<<q1->num3<<endl; cout<<q1->num4<<endl; }输出结果:2131065614208553分析结果:结构体类型强制转换,用mopaChann_t的结构,去套chann_t的地址空间。对于第一次输出结果p1(chann_t) q1(mpoaChann_t)-------- ---------------num1-------- chann_t变量num2-------- --------------- 未知 num3-------- ---------------未知 num4-------- ---------------用q1的类型去套p1指向的地址空间,由于前两个变量类型对应上,而对于q1的后两个变量p1没定义,直接读紧接其后的空间(不是p1管理的空间,出来的值是不可确定的)
第二次输出结果就不做说明了,平时都那么写。第三次输出结果,同样使用以上的分析方法p1(chann_t) q1(mpoaChann_t)----------- ---------------num1 num3----------- ---------------num2 ----------- chann_t 未知 ----------- --------------- 未知 num4----------- ---------------注意输出顺序 q1->chan.num1、q1->chan.num2、num3、num4如上图所示,q1->chan.num1对应num2(值为2),q1->chan.num2对应第一个“未知”(值为1310656),num3对应num1(值为1),num4对应第二个“未知”(值为4208553)。因此有输出结果
2131065614208553结论:对于结构体类型强制转换,用类型套空间,可分析出转换后结果。