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要走的路吗?
这是什么平台运行?
一个可能的原因是违反了对齐限制,如果返回的指针是奇数并且平台不支持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)
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |