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

Neo*_*low 1 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
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改内部的if

rdwValue = *(pParamPtr);
Run Code Online (Sandbox Code Playgroud)

这很有效.

我是否通过这种类型转换来做违反规则的事情?

我需要的是从地址开始pParamPtr到rdwValue 得到一个4字节[unsigned long is 4 bytes] .

这是memcpy要走的路吗?

unw*_*ind 5

这是什么平台运行?

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

更新根据评论,OP正在MIPS上运行,这当然有对齐限制.

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

unsigned long rdwValue = *(unsigned long *) pParamPtr;
Run Code Online (Sandbox Code Playgroud)

最简单的方法是逐个读取字节,这也使您有机会明确地处理字节序.假设小端(并且至少32位int精度):

unsigned long rwdValue = pParamPtr[0] | (pParamPtr[1] << 8) | (pParamPtr[2] << 16) | (pParamPtr[3] << 24);
Run Code Online (Sandbox Code Playgroud)

  • 正如unwind所说,当你访问内存时,你需要使用与你使用的存储类型大小一致的地址.参见[此处](http://en.wikibooks.org/wiki/MIPS_Assembly/MIPS_Instructions)和[here](http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/addr的.html) (2认同)