64位iOS设备中的realloc()
当我在我的项目中使用C函数64位iOS设备中的realloc(),ios,c,realloc,Ios,C,Realloc,当我在我的项目中使用C函数realloc(p,size)时,代码在模拟器和iphone5上都运行良好 然而,当代码在iphone6plus上运行时,会发生一些奇怪的事情。要更改的内容a点!更糟糕的是,每次函数运行时输出都不同 以下是测试代码: #define LENGTH (16) - (void)viewDidLoad { [super viewDidLoad]; char* a = (char*)malloc(LENGTH+1); a[0] = 33;
realloc(p,size)
时,代码在模拟器和iphone5上都运行良好
然而,当代码在iphone6plus上运行时,会发生一些奇怪的事情。要更改的内容a
点!更糟糕的是,每次函数运行时输出都不同
以下是测试代码:
#define LENGTH (16)
- (void)viewDidLoad {
[super viewDidLoad];
char* a = (char*)malloc(LENGTH+1);
a[0] = 33;
a[1] = -14;
a[2] = 76;
a[3] = -128;
a[4] = 25;
a[5] = 49;
a[6] = -45;
a[7] = 56;
a[8] = -36;
a[9] = 56;
a[10] = 125;
a[11] = 44;
a[12] = 26;
a[13] = 79;
a[14] = 29;
a[15] = 66;
//print binary contents pointed by a, print each char in int can also see the differene
[self printInByte:a];
realloc(a, LENGTH);
[self printInByte:a]
free(a);
}
-(void) printInByte: (char*)t{
for(int i = 0;i < LENGTH ;++i){
for(int j = -1;j < 16;(t[i] >> ++j)& 1?printf("1"):printf("0"));
printf(" ");
if (i % 4 == 3) {
printf("\n");
}
}
}
#定义长度(16)
-(无效)viewDidLoad{
[超级视图下载];
char*a=(char*)malloc(长度+1);
a[0]=33;
a[1]=-14;
a[2]=76;
a[3]=-128;
a[4]=25;
a[5]=49;
a[6]=-45;
a[7]=56;
a[8]=-36;
a[9]=56;
a[10]=125;
a[11]=44;
a[12]=26;
a[13]=79;
a[14]=29;
a[15]=66;
//打印a所指的二进制内容,打印int中的每个字符也可以看到差异
[自行打印字节:a];
realloc(a,长度);
[自行打印字节:a]
免费(a);
}
-(空)打印字节:(字符*)t{
对于(int i=0;i++j)和1?printf(“1”):printf(“0”);
printf(“”);
如果(i%4==3){
printf(“\n”);
}
}
}
还有一件事,当长度不是16时,它可以很好地分配到[LENGTH-1]。然而,如果长度正好是16,则会出现问题
任何想法都将不胜感激。您需要:
a = realloc(a, LENGTH);
原因是realloc()可能会移动块,因此需要更新指向新地址的指针:
来自
realloc
man文档:
函数的作用是:尝试更改分配的大小
指出
按ptr到size,并返回ptr。如果没有足够的空间
放大ptr指向的内存分配,realloc()创建一个新的
分配,复制ptr所指向的尽可能多的旧数据
到新分配,释放旧分配,并返回指向的指针
分配的内存
因此,您必须编写:
a=realloc(a,长度)代码>因为在已经分配的内存块不能变大的情况下,区域将被移动到另一个位置,因此,区域的地址将改变。这就是为什么realloc
返回内存指针。我强烈建议使用std::vector而不是像这样的裸指针来避免此类问题@问题是关于C和ObjuleC不C++(或Objul-C++)