您的位置:首页 > 其它

EXC_BAD_ACCESS and char pointer to float pointer cast

2015-06-11 13:04 330 查看
float testFloat() {
char mem[32];
char *charPtr = &mem[0];
float *floatPtr = (float*)(charPtr + 1);
float f = *floatPtr; //EXC_BAD_ACCESS
return f;
}
You are correct, this is due to pointer alignment. On many RISC systems, the alignment needs to be at least as large as the data-type itself. (ARM falls into this category.)In this case, 
float
 is 4 bytes, so the address needs to be aligned to 4 bytes. (divisible by 4)Furthermore, this type of type-punning violates strict-aliasing.On x86 systems, memory accesses do not always have to be aligned - but there will usually be a performance penalty on a misaligned access.
This happens due to memory misalignment. The arm processor has issues with it.Found this solution, http://www.cocos2d-x.org/forums/6/topics/18183Instead of
float *floatPtr = (float*)(charPtr + 1);float f = *floatPtr; //EXC_BAD_ACCESSreturn f;
Use
float f;unsigned char* pData = (charPtr + 1);memcpy( &f, pData, sizeof( float ) );
 
Hi guys,I’ve found problems using the CCBReader when deploying my game to an iPhone 4.There are several potential lines in CCBReader where the game will crash due to memory misalignment.in CCBReader::readHeader()
int magicBytes = *((int*)(this->mBytes + this->mCurrentByte));
should be
int magicBytes;
unsigned char* pData = ( this->mBytes + this->mCurrentByte );
memcpy( &magicBytes, pData, sizeof( int ) );
in CCBReader::readFloat() there is something really dangerous
float * pF = (float*)(this->mBytes + this->mCurrentByte);
float f = 0;
memcpy(&f, pF, sizeof(float));
should be
float f;
unsigned char* pData = ( this->mBytes + this->mCurrentByte );
memcpy( &f, pData, sizeof( float ) );
The ARM processor which is inside all iPhones, iPads, etc. Doesn’t like memorymisalignment! so be careful doing castings with memory which could be misalignmentafter the casting!You can find more info about this issue here:http://stackoverflow.com/questions/3243146/why-does-this-exc-bad-access-happen-with-long-long-and-not-with-int19http://stackoverflow.com/questions/7788216/exc-bad-access-and-char-pointer-to-float-pointer-cast15

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: