数组定义起始地址的问题
加入有如下代码行:uchar rad[6]={0};Read_InfNFlashSegment(Flash_InfD_BaseAddr,DGsensor_RadX_Offset,rad,6);//读出rad的值gSlopeBaseAngle.rad_x=*((int*)&rad[0]);//rad_x,rad_y,rad_z是int类型的...
·
假如有如下代码行:
uchar rad[6]={0};
Read_InfNFlashSegment(Flash_InfD_BaseAddr,DGsensor_RadX_Offset,rad,6); //读出rad的值
gSlopeBaseAngle.rad_x=*((int*)&rad[0]); //rad_x,rad_y,rad_z是int类型的值
gSlopeBaseAngle.rad_y=*((int*)&rad[2]);
gSlopeBaseAngle.rad_z=*((int*)&rad[4]);
实际上 通过指针转化后的值gSlopeBaseAngle.rad_x并不等于rad[0]*256+rad[1](假定小端模式),而是会多出来一个异常的字符。
主要原因是因为
uchar类型的是一字节对齐的
int类型是2字节对齐的,如果MCU的系统字是2字节,则定义int类型可能会总是在偶地址开始
。。。所以若果uchar是定义的起始地址在基地址时,就会出错,多出来一个填充地址
解决方法:
#pragma data_alignment=2
uchar rad[6]={0};
#pragma pack ()
加上这句话后,定义rad时则会自动2字节对齐,起始地址就会在int对齐字上,通过指针访问就正常了
更多推荐
已为社区贡献2条内容
所有评论(0)