sizeof和内存对齐
在做一个IOT项目时,遇上这样的问题:
要发的通信数据都是以结构体来定义的,
typedef_t struct { uint8_t head[2]; ///< 包头(header)固定为0xFFFF uint16_t len; ///< 长度(len)是指从cmd 开始到整个数据包结束所占用的字节数 uint8_t cmd; ///< 命令字(cmd)表示具体的命令含义,详见协议举例 uint8_t sn; ///< 消息序号(sn)由发送方给出,接收方响应命令时需把消息序号返回给发送方 uint8_t flags[2]; ///< 标志位(flag),产品填写默认0 }protocolHead_t; /** 4.1 WiFi模组请求设备信息 协议结构体 */ typedef_t struct { protocolHead_t head; ///< 协议标准头结构体 uint8_t protocolVer[8]; ///< 协议版本号 uint8_t p0Ver[8]; ///< p0协议版本号 uint8_t hardVer[8]; ///< 硬件版本号 uint8_t softVer[8]; ///< 软件版本号 uint8_t productKey[32]; ///< 产品标识码 uint16_t ninableTime; ///< 绑定超时(秒) uint8_t devAttr[8]; ///< 设备属性 uint8_t productSecret[32]; ///< 产品密钥 uint8_t sum; ///< 检验和 }protocolDeviceInfo_t;
当我去做如下这个运算的时候发现,总是比实际结构体所点的空间115个字节多一个字节。
sizeof(protocolDeviceInfo_t)
这个是内存对齐方式所致
使用如下的方式解决这一问题
#pragma pack (1) //按一字节对齐
/** 协议标准头结构体 */ #pragma pack (1) typedef_t struct { uint8_t head[2]; ///< 包头(header)固定为0xFFFF uint16_t len; ///< 长度(len)是指从cmd 开始到整个数据包结束所占用的字节数 uint8_t cmd; ///< 命令字(cmd)表示具体的命令含义,详见协议举例 uint8_t sn; ///< 消息序号(sn)由发送方给出,接收方响应命令时需把消息序号返回给发送方 uint8_t flags[2]; ///< 标志位(flag),产品填写默认0 }protocolHead_t; /** 4.1 WiFi模组请求设备信息 协议结构体 */ typedef_t struct { protocolHead_t head; ///< 协议标准头结构体 uint8_t protocolVer[8]; ///< 协议版本号 uint8_t p0Ver[8]; ///< p0协议版本号 uint8_t hardVer[8]; ///< 硬件版本号 uint8_t softVer[8]; ///< 软件版本号 uint8_t productKey[32]; ///< 产品标识码 uint16_t ninableTime; ///< 绑定超时(秒) uint8_t devAttr[8]; ///< 设备属性 uint8_t productSecret[32]; ///< 产品密钥 uint8_t sum; ///< 检验和 }protocolDeviceInfo_t; #pragma pack ()

浙公网安备 33010602011771号