2013-02-27 57 views
1

C-初級問題:崩潰而類型轉換指針 - Visual C

我有下面的代碼崩潰在行unsigned long rdwValue = *((unsigned long*)pParamPtr);。我交叉編譯使用GCC

unsigned char* pParamPtr = GetNvParamRamAddress(ParameterId, swIndex); 

if (0 != pParamPtr) 
{ 
    unsigned long rdwValue = *((unsigned long*)pParamPtr);// CRASHES 
} 

在Fedora機器上的MIPS32目標代碼,但如果我改變if裏面的線

rdwValue = *(pParamPtr); 

這個工程。

我對這個類型轉換規則做了些什麼?

我需要的是從pParamPtr開始的地址得到一個四字節的[無符號長整數是4個字節]到rdwValue。

難道是memcpy要走的路嗎?

回答

5

這是什麼平臺上運行?

一個可能的原因是對齊限制被違反,如果返回的指針是奇數,並且平臺不支持從奇數地址讀取unsigned long,這將失敗。

UPDATE根據評論,OP在MIPS上運行這個操作系統,這當然有對齊限制。

作爲未成年人的風格來看,並不需要你的一對外部括號的,它可能只是:

unsigned long rdwValue = *(unsigned long *) pParamPtr; 

這可能是最簡單的讀取字節一個接一個,也給你一個機會明確處理字節序。假定小端(和int精度至少32位):

unsigned long rwdValue = pParamPtr[0] | (pParamPtr[1] << 8) | (pParamPtr[2] << 16) | (pParamPtr[3] << 24); 
+0

我交叉編譯使用GCC一個Fedora機器上的MIPS32目標的代碼。如果我不允許這樣做,你能提出一個解決辦法嗎? – NeonGlow 2013-02-27 10:04:05

+0

這真是太棒了。謝謝。 :) – NeonGlow 2013-02-27 10:08:04

+2

正如unwind所說,當您訪問內存時,您需要使用與您使用的存儲類型的大小對齊的地址。見例如[這裏](http://en.wikibooks.org/wiki/MIPS_Assembly/MIPS_Instructions)和[這裏](http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/addr.html ) – Michael 2013-02-27 10:08:33