在项目代码中遇到了先定义一个结构体类型变量,马上将其强制转换为另一种结构体类型变量的情况,小菜鸡非常疑惑,于是进行了一些学习探究,分享给各位。
代码如图所示:
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.成员变量名不储存在内存中,只存在在代码中。
入门菜鸟学习记录,还请批评指正