[英]Crash while typecasting a pointer - 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个字节]。
它是memcpy
的路吗?
它在什么平台上运行?
一个可能的原因是违反了对齐限制,如果返回的指针为奇数,并且平台不支持从奇数地址读取unsigned long
,则此操作将失败。
更新根据评论,OP在MIPS上运行此程序,它当然具有对齐限制。
作为次要的风格问题,不需要您的外部括号,这可能只是:
unsigned long rdwValue = *(unsigned long *) pParamPtr;
可能最容易地一一读取字节,这也使您有机会显式地处理字节序。 假设使用低位字节序(至少32位的int
精度):
unsigned long rwdValue = pParamPtr[0] | (pParamPtr[1] << 8) | (pParamPtr[2] << 16) | (pParamPtr[3] << 24);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.