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/18183
Instead of
float *floatPtr = (float*)(charPtr + 1); float f = *floatPtr; //EXC_BAD_ACCESS return 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 memory
misalignment! so be careful doing castings with memory which could be misalignment
after 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-int19
http://stackoverflow.com/questions/7788216/exc-bad-access-and-char-pointer-to-float-pointer-cast15
EXC_BAD_ACCESS and char pointer to float pointer cast
最新推荐文章于 2020-10-05 19:17:15 发布