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 ()

 

posted @ 2017-08-02 10:41  杰克纬伯  阅读(377)  评论(0)    收藏  举报