在转换指针时发生崩溃 - C

时间:2013-02-27 09:59:09

标签: c

C-Beginner问题:

我有以下代码在第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个字节[unsigned long is 4 bytes]。

它是memcpy要走的路吗?

1 个答案:

答案 0 :(得分:5)

这是在运行什么平台?

一个可能的原因是违反了对齐限制,如果返回的指针是奇数并且平台不支持从奇数地址读取unsigned long,那么这将失败。

UPDATE 根据评论,OP在MIPS上运行此操作,这肯定有对齐限制。

作为一个次要的风格点,不需要你的外部括号,它可能只是:

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

逐个读取字节可能最容易,这也让您有机会明确地处理字节序。假设little-endian(至少32位int精度):

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