簡體   English   中英

EXC_BAD_ACCESS和char指針浮點指針強制轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM