2013-02-27 50 views
1

C-初级问题:崩溃而类型转换指针 - Visual C

我有下面的代码崩溃在行unsigned long rdwValue = *((unsigned long*)pParamPtr);。我交叉编译使用GCC

unsigned char* pParamPtr = GetNvParamRamAddress(ParameterId, swIndex); 

if (0 != pParamPtr) 
{ 
    unsigned long rdwValue = *((unsigned long*)pParamPtr);// CRASHES 
} 

在Fedora机器上的MIPS32目标代码,但如果我改变if里面的线

rdwValue = *(pParamPtr); 

这个工程。

我对这个类型转换规则做了些什么?

我需要的是从pParamPtr开始的地址得到一个四字节的[无符号长整数是4个字节]到rdwValue。

难道是memcpy要走的路吗?

回答

5

这是什么平台上运行?

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

UPDATE根据评论,OP在MIPS上运行这个操作系统,这当然有对齐限制。

作为未成年人的风格来看,并不需要你的一对外部括号的,它可能只是:

unsigned long rdwValue = *(unsigned long *) pParamPtr; 

这可能是最简单的读取字节一个接一个,也给你一个机会明确处理字节序。假定小端(和int精度至少32位):

unsigned long rwdValue = pParamPtr[0] | (pParamPtr[1] << 8) | (pParamPtr[2] << 16) | (pParamPtr[3] << 24); 
+0

我交叉编译使用GCC一个Fedora机器上的MIPS32目标的代码。如果我不允许这样做,你能提出一个解决办法吗? – NeonGlow 2013-02-27 10:04:05

+0

这真是太棒了。谢谢。 :) – NeonGlow 2013-02-27 10:08:04

+2

正如unwind所说,当您访问内存时,您需要使用与您使用的存储类型的大小对齐的地址。见例如[这里](http://en.wikibooks.org/wiki/MIPS_Assembly/MIPS_Instructions)和[这里](http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/addr.html ) – Michael 2013-02-27 10:08:33