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字节[无符号长是4字节]。
这是条路吗?

最佳答案

这是在哪个平台上运行的?
一个可能的原因是违反了对齐限制,如果返回的指针是奇数,并且平台不支持从奇数地址读取unsigned longs,那么这将失败。
根据评论更新操作正在MIPS上运行此操作,这肯定有对齐限制。
作为一个次要的风格点,你不需要外圆括号,它可以是:

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

一个接一个地读取字节可能是最简单的,这也给了您显式处理endianness的机会。假设是小尾数(至少32位int精度):
unsigned long rwdValue = pParamPtr[0] | (pParamPtr[1] << 8) | (pParamPtr[2] << 16) | (pParamPtr[3] << 24);

08-16 21:26