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,
floatis 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
相关文章推荐
- MySQL数据库备份与还原
- LCA模板——倍增法
- Cookie/Session机制详解
- 统计大量文本中重复字符串的最大个数
- SAT几何专业词汇一览
- dllimport&dllexport
- MatrixState中的参数与 CP_Na_Cl中参数的比较
- 正则表达式说明
- lldb 调试
- 数字证书简介
- 艾森哲面试 Accenture
- Struts2获取演示示例教程
- win7开机提示未能连接一个windows服务的详细解决办法
- Jquery绑定事件
- C++ Prim算法构造可以使n个城市连接的最小生成树
- Python 2.7 Data Type for Text Strings: Unicode and Str
- poj 1125 Stockbroker Grapevine(多源最短)
- html按钮跳转
- 斗牛游戏的概率探索
- 喇叭的声音和素质成反比--2008-06-27 博客搬家