[英]Crash while typecasting a pointer - C
初學者問題:
我有以下代碼在unsigned long rdwValue = *((unsigned long*)pParamPtr);
。 我正在使用GCC在fedora機器上交叉編譯MIPS32目標的代碼
unsigned char* pParamPtr = GetNvParamRamAddress(ParameterId, swIndex);
if (0 != pParamPtr)
{
unsigned long rdwValue = *((unsigned long*)pParamPtr);// CRASHES
}
但是如果我將if
內的行更改為
rdwValue = *(pParamPtr);
這可行。
我使用這種類型轉換是否違反規則?
我需要的是從pParamPtr
到rdwValue的地址獲取四個字節[無符號長為4個字節]。
它是memcpy
的路嗎?
它在什么平台上運行?
一個可能的原因是違反了對齊限制,如果返回的指針為奇數,並且平台不支持從奇數地址讀取unsigned long
,則此操作將失敗。
更新根據評論,OP在MIPS上運行此程序,它當然具有對齊限制。
作為次要的風格問題,不需要您的外部括號,這可能只是:
unsigned long rdwValue = *(unsigned long *) pParamPtr;
可能最容易地一一讀取字節,這也使您有機會顯式地處理字節序。 假設使用低位字節序(至少32位的int
精度):
unsigned long rwdValue = pParamPtr[0] | (pParamPtr[1] << 8) | (pParamPtr[2] << 16) | (pParamPtr[3] << 24);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.