您好,登錄后才能下訂單哦!
場景
將代碼移植到Wince5.0系統(tǒng)上,芯片框架是mips,之前的代碼在x86和arm等架構上運行正常。顯示bmp位圖的時候會彈出窗口提示:異常:0x80000002錯誤提示
步驟
1)
通過VS錯誤查詢工具得到的結果是:內(nèi)存已經(jīng)用完,實際上還有內(nèi)存可以申請
2)
嘗試加載小圖片,無效
3)
不加載圖片,成功顯示
4)
嘗試在其他的地方可以申請到8MB的內(nèi)存
5)
通過日志輸出,定位到bmp位圖的結構體賦值的過程中,出現(xiàn)錯誤,初步懷疑是棧溢出,但是如果省去不調(diào)用,還是可以執(zhí)行成功的
6)
百度過程中,發(fā)現(xiàn)該錯誤提示還有一層含義:
程序讀取一個未經(jīng)對齊的數(shù)據(jù)時引發(fā)的異常 EXCEPTION_DATATYPE_MISALIGNMENT 屬于硬件異常
7)
原來bmp位圖的結構體的頭部是一個14個字節(jié)的結構體,里面的變量并沒有進行字節(jié)的對齊,屬于非對齊的地址訪問,所以有些不對齊的b變量不能夠直接訪問,需要將數(shù)據(jù)通過memcpy逐個字節(jié)拷貝出來,然后拼湊成完整的屬性。
//在mips架構下不支持非對齊數(shù)據(jù)訪問,bmp位圖頭部是14個字節(jié),不符合4個字節(jié)對齊訪問,因此采用字節(jié)拷貝的方式進行訪問
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));
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。