我正在为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上的指针对齐有关。
答案 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);
是否会违反指针对齐要求?
不确定,但值得一试。