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

Tob*_*kom 3 c++ iphone

我正在为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;
}
Run Code Online (Sandbox Code Playgroud)

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

Mys*_*ial 7

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

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

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

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

  • `char*`和`unsigned char*`免于严格别名规则,因此这段特殊代码不会违反它. (2认同)