博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结构体之间的转换
阅读量:5923 次
发布时间:2019-06-19

本文共 1840 字,大约阅读时间需要 6 分钟。

结构体之间的转换

 
看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
结论:对于结构体类型强制转换,用类型套空间,可分析出转换后结果。

转载于:https://www.cnblogs.com/vmyspace/archive/2012/01/30/2332221.html

你可能感兴趣的文章
博文批量发布工具使用说明
查看>>
Active Directory还原工具之四ADRecycleBIN
查看>>
一起学Shell之(二)输出以及其它
查看>>
Windows Server 2008 R2 之十九Bcdedit的使用
查看>>
[转] SqlServe到PG迁移错误:无效的编码序列"UTF8": 0x00
查看>>
Nginx + nagios +perl fcgi 取缔apache
查看>>
Puppet扩展篇1-自定义fact结合ENC(hirea)的应用实践
查看>>
《从零开始学Swift》学习笔记(Day 20)——函数中参数的传递引用
查看>>
脚本监控网络状态,输出日志并归档(V2)
查看>>
轻量级HTTP服务器Nginx(Nginx日常维护)
查看>>
Android系统的开机画面显示过程分析(1)
查看>>
7.VMware vsphere 5.0新体验-备份
查看>>
组建高效快速研发团队的必要角色
查看>>
基于Windows Media Service的流媒体直播系统
查看>>
linux下和windows下如何防止php木马
查看>>
SQL2K数据库开发八之表操作创建主键
查看>>
WCF分布式安全开发实践(6):传输安全模式之自定义X509Certificate证书验证
查看>>
打造自己的LINQ Provider(中):IQueryable和IQueryProvider
查看>>
【代码分享-SQL】(已有数据)表的[ID]字段变更为‘自增长’
查看>>
如何有效的部署规划Exchange Server 2010
查看>>