您的位置:首页 > 其它

指向结构体类型的指针强制转换为指向另外一种结构体类型。会不会出现问题?

2015-06-01 19:37 316 查看
结构体和int等类型一样,都是数据类型。其他类型怎么转换,结构体就怎么转换,没有什么特殊的地方。

楼主可能想知道的不是结构体怎样强制转换这个问题吧,猜测,楼主想知道如下几个问题:

如果将一个结构体强制类型转换为另一个结构体(或者类型),那这个结构体的成员会怎样了?

如果将一个结构体强制类型转换为另一个结构体(或者类型),那么这个结构体成员的数值又会是什么了?

解答:

1、结构体的本质是:我们和C语言约定了一段内存空间的长短,及其内容的安排。假设下面两个结构体:

struct A1

{

int a;

char b;

};

struct A2

{

char a;

int b;

};

接着,用struct A1和struct A2定义变量,并赋初值:

struct A1 x = {10, ‘A’};

struct A2 y = {‘A’, 10};

现在最重要的是,要知道x和y的内存情况:

x的内存安排是:前4B,后1B;

y的内存安排是:前1B,后4B。

如果有struct A2 z;

z.a = ((struct A2)x).a;

那么,C语言会对x的空间,按照struct A2的格局进行解释:

也就是说,将x的第一个字节看成第一个成员,且按ASCII码处理数据,而将后面的4B看成第二个成员,并按补码格式解释数据。

比如一个这样的一个结构体类型定义

[code]typedef struct
{
  osal_event_hdr_t  hdr;           //!< GAP_MSG_EVENT and status
  uint8 opcode;                    //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES
} gapEventHdr_t;


该结构体的一个实例,为指针变量pMsg

另外一个结构体类型的定义是

[code]typedef struct
{
  osal_event_hdr_t  hdr;              //!< GAP_MSG_EVENT and status
  uint8 opcode;                       //!< GAP_DEVICE_INIT_DONE_EVENT
  uint8 devAddr[B_ADDR_LEN];          //!< Device's BD_ADDR
  uint16 dataPktLen;                  //!< HC_LE_Data_Packet_Length
  uint8 numDataPkts;                  //!< HC_Total_Num_LE_Data_Packets
} gapDeviceInitDoneEvent_t;


同样定义了一个实例

gapDeviceInitDoneEvent_t *pPkt

下面是指针类型的强制转换:

gapDeviceInitDoneEvent_t *pPkt = (gapDeviceInitDoneEvent_t *) pMsg;


各位大神看到觉得这样行吗?

欢迎讨论留言。。。。。期待您的加入。

QQ1557862201
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: