项目在iPhone 5,4s模拟器上运行完全正常。而在5s,6模拟器上经常会随机崩溃,偶尔正常,崩溃的位置一般在固定的几处,比如hashtable find函数。5s以上是64位cpu。通过排除法找到了项目中用到的一个第三方写的加密类,里面把一个4字节类型定义成了long,而long在64位下是8个字节,导致堆溢出了,覆盖了后面的其他数据。
一.c语言数据占用字节
32位:char 1 short 2 int 4 long 4 long long 8
64位:char 1 short 2 int 4 long 8 long long 8
二.编译器的数据模型
Datetype LP64 ILP64 LLP64 ILP32 LP32
char 8 8 8 8 8
short 16 16 16 16 16
int 32 64 32 32 16
long 64 64 32 32 32
long long 64
pointer 64 64 64 32 32
一般情况下windows64位一般使用LLP64模型
64位Unix,Linux使用的是LP64模型
综合来看,32位程序升级64位主要是long和pointer指针长度不一致,需要相应的做修改。