簡體   English   中英

強制轉換指針時崩潰-C

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM