关于结构体字对齐

14 篇文章 0 订阅

1、问题引入

在16位MCU中,如果定义这样的结构体

typedef struct
{
int16 c_aging; //=aging*100
uint8 c_Decay_f; //=factor*100
int16 c_phase26th; //=phaselag26h
}cmstate ;

当需要通过指针访问该结构体时,

uint8 *p_cmstate;
const cmstate* savecmstate;
p_cmstate=(uint8 *)&savecmstate->c_aging;

a)将值0xAABB,0x55,0xCCDD,存入结构体后,使用p_cmstate读出值后发现如下:

 0xAA,0xBB,0x55,0x00,0xCC,0xDD(按顺序排列)

可见,其中多了值0x00。

2、原因解析

在 通过p_cmstate访问结构体cmstate时,由于该结构体定义时未字节对齐,所以在c_Decay_f定义后,编译器自动在c_phase26th

前补充一字节。结构体默认要与最大的那个字节对齐。

3、解决方法

a)、在uint8 c_Decay_f;后再定义一个预留的字节

b)、在结构体定义前后分别加入

  1. #pragma pack(1)  
  2. #pragma pack()
  3. 强制结构体对齐到1字节



可参考文章http://blog.csdn.net/lanzhihui_10086/article/details/44353381

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值