看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;
}
输出结果
1
2
1310656
4208553
将q1=(mpoaChann_t *)p1;改为:q1->chan =p;
输出结果:
1
2
3
4
若将结构体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;
}
输出结果:
2
1310656
1
4208553
分析结果:结构体类型强制转换,用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)。因此有输出结果
2
1310656
1
4208553
结论:对于结构体类型强制转换,用类型套空间,可分析出转换后结果。
在贴一下我自己的测试代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct _AAA{
unsigned char a1;
unsigned char a2;
char *a3;
char *a4;
}AAA;
typedef struct _BBB{
unsigned int b1;
char *b2;
char *b3;
}BBB;
int main()
{
AAA a;
a.a1 = 'A';
a.a2 = 'B';
a.a3 = "CBD";
a.a4 = "EFGH";
BBB *b;
b = (BBB*)(&a);
printf("b1 is %d/n",b->b1);
printf("b2 is %s/n",b->b2);
printf("b3 is %s/n",b->b3);
AAA *c;
c = (AAA*)b;
printf("c1 is %c/n",c->a1);
printf("c1 is %c/n",c->a2);
printf("c3 is %s/n",c->a3);
printf("c4 is %s/n",c->a4);
return 0;
}