EXC_BAD_ACCESS和char指针浮点指针强制转换

时间:2011-10-17 00:02:12

标签: iphone c++

我正在为ipad程序编写一个文件加载器,我得到了奇怪的EXC_BAD_ACCESS异常。这是一段简短的代码,我认为是错误的原因:

float testFloat() {
    char mem[32];
    char *charPtr = &mem[0];
    float *floatPtr = (float*)(charPtr + 1);
    float f = *floatPtr; //EXC_BAD_ACCESS
    return f;
}

只有当charPtr的偏移量不能被4整除时才会发生错误,所以我想它可能与ARM CPU上的指针对齐有关。

3 个答案:

答案 0 :(得分:7)

你是对的,这是由于指针对齐。在许多RISC系统上,对齐需要至少与数据类型本身一样大。 (ARM属于这一类。)

在这种情况下,float是4个字节,因此地址需要与4个字节对齐。 (可被4整除)

此外,这种类型的惩罚违反了严格别名。

在x86系统上,内存访问并不总是必须对齐 - 但是对于未对齐的访问通常会有性能损失。

答案 1 :(得分:2)

这是由于内存不对齐造成的。 手臂处理器存在问题。

找到这个解决方案, http://www.cocos2d-x.org/forums/6/topics/18183

而不是

float *floatPtr = (float*)(charPtr + 1);
float f = *floatPtr; //EXC_BAD_ACCESS
return f;

使用

float f;
unsigned char* pData = (charPtr + 1);
memcpy( &f, pData, sizeof( float ) );

答案 2 :(得分:-1)

怎么样

struct MyStruct
{
char* _charPtr;
float* _floatPtr;
};

MyStruct myStruct = &mem[0];

float f = *(myStruct._floatPtr);

是否会违反指针对齐要求?
不确定,但值得一试。