1

C-初学者问题:

我有以下代码在 line 处崩溃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要走的路吗?

4

1 回答 1

5

这是在什么平台上运行的?

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

更新根据评论,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);
于 2013-02-27T10:02:40.593 回答