场景

    将代码移植到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));