Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
64位iOS设备中的realloc()_Ios_C_Realloc - Fatal编程技术网

64位iOS设备中的realloc()

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;

当我在我的项目中使用C函数
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++)