繁体   English   中英

强制转换指针时崩溃-C

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM