场景
将代码移植到Wince5.0系统上,芯片框架是mips,之前的代码在x86和arm等架构上运行正常。显示bmp位图的时候会弹出窗口提示:异常:0x80000002错误提示
步骤
1)
通过VS错误查询工具得到的结果是:内存已经用完,实际上还有内存可以申请
2)
尝试加载小图片,无效
3)
不加载图片,成功显示
4)
尝试在其他的地方可以申请到8MB的内存
5)
通过日志输出,定位到bmp位图的结构体赋值的过程中,出现错误,初步怀疑是栈溢出,但是如果省去不调用,还是可以执行成功的
6)
百度过程中,发现该错误提示还有一层含义:
程序读取一个未经对齐的数据时引发的异常 EXCEPTION_DATATYPE_MISALIGNMENT 属于硬件异常
7)
原来bmp位图的结构体的头部是一个14个字节的结构体,里面的变量并没有进行字节的对齐,属于非对齐的地址访问,所以有些不对齐的b变量不能够直接访问,需要将数据通过memcpy逐个字节拷贝出来,然后拼凑成完整的属性。
//在mips架构下不支持非对齐数据访问,bmp位图头部是14个字节,不符合4个字节对齐访问,因此采用字节拷贝的方式进行访问
int offsetWidth = (int)&((PBITMAPINFOHEADER)0)->biWidth;
memcpy(&(dest->m_width), offset + offsetWidth, sizeof(LONG));
int offsetHeight = (int)&((PBITMAPINFOHEADER)0)->biHeight;
memcpy(&(dest->m_height), offset + offsetHeight, sizeof(LONG));