C语言结构体类型强制转换的思考

        在项目代码中遇到了先定义一个结构体类型变量,马上将其强制转换为另一种结构体类型变量的情况,小菜鸡非常疑惑,于是进行了一些学习探究,分享给各位。

        代码如图所示:

data_t data = {0};
req_data_t *req= (req_data_t *)&data;
rsp_data_t *rsp= {rsp_data_t *}&data;

        这里将data强制转换为req_data_t和rsp_data_t类型,作用是用这两种类型重新解释data_t。这样做可以让你再data的内存范围内用req和rsp指针访问和更改data的值。

        如下图所示,各种类型中可能有相同的成员变量,也可能用新的成员变量解释data_t中的data数组。

typedef struct
{	
	uint8_t  cmd;
	uint8_t  cmd_type;
	id_t source_id;	
	id_t dst_id;		
	uint8_t  data[MAX_RFCMD_LEN-11];
}data_t;

typedef struct{
	uint8_t cmd;
	uint8_t cmd_type;
    id_t source_id;	
	id_t dst_id;		
	
}data_req_t;

typedef struct{
	uint8_t cmd;
	uint8_t cmd_type;
    id_t source_id;	
	id_t dst_id;
	uint8_t partition;
	version_t version;
	param_t	param;
	uint16_t	buildNo;
}data_rsp_t;

        需要注意的是req_data_t和rsp_data_t的内存大小必须小于等于data_t,否则可能会导致内存溢出。

        补充:结构体类型在内存中的存储方式:

        1.顺序存储,按照成员变量定义的顺序存储。

        2.内存对齐,为了提高访问效率,结构体的成员可能会根据其类型进行内存对齐。如一个char(1字节)和一个int类型(4字节),那么可能会在char类型后面补充3个空字节保持对齐。

        3.成员变量名不储存在内存中,只存在在代码中。

入门菜鸟学习记录,还请批评指正

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子大人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值