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)、在结构体定义前后分别加入
- #pragma pack(1)
- #pragma pack()
- 强制结构体对齐到1字节
可参考文章http://blog.csdn.net/lanzhihui_10086/article/details/44353381