[英]EXC_BAD_ACCESS and char pointer to float pointer cast
我正在為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上的指針對齊有關。
你是對的,這是由於指針對齊。 在許多RISC系統上,對齊需要至少與數據類型本身一樣大。 (ARM屬於這一類。)
在這種情況下, float
是4個字節,因此地址需要與4個字節對齊。 (可被4整除)
此外,這種類型的懲罰違反了嚴格別名。
在x86系統上,內存訪問並不總是必須對齊 - 但是對於未對齊的訪問通常會有性能損失。
這是由於內存不對齊造成的。 手臂處理器有問題。
找到了這個解決方案, 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 ) );
怎么樣
struct MyStruct
{
char* _charPtr;
float* _floatPtr;
};
MyStruct myStruct = &mem[0];
float f = *(myStruct._floatPtr);
它會違反指針對齊要求嗎?
不確定,但值得一試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.