结构数组上的realloc()给出的下一个大小无效
我有这个功能。如您所见,所有操作都是在函数中完成的,我不会在main中进行分配,然后将任何内容传递给它(我只会在函数完成后返回指向数组的指针)。函数本身(数组大小固定)可以工作,但realloc失败结构数组上的realloc()给出的下一个大小无效,c,arrays,pointers,struct,dynamic-memory-allocation,C,Arrays,Pointers,Struct,Dynamic Memory Allocation,我有这个功能。如您所见,所有操作都是在函数中完成的,我不会在main中进行分配,然后将任何内容传递给它(我只会在函数完成后返回指向数组的指针)。函数本身(数组大小固定)可以工作,但realloc失败 struct database *parse() { int i = 0; int n = 1; FILE *dbase = (fopen(PATH, "r")); if (dbase == NULL) { fprintf(stderr, ERRO
struct database *parse() {
int i = 0;
int n = 1;
FILE *dbase = (fopen(PATH, "r"));
if (dbase == NULL) {
fprintf(stderr, ERRORE_APERTURA);
exit(EXIT_FAILURE);
}
struct database *database_array = calloc(20*n, sizeof(struct database));
if (database_array == NULL) {
fprintf(stderr, "Impossibile allocare memoria\n");
exit(EXIT_FAILURE);
}
while (feof(dbase) == 0) {
fscanf(dbase, "%[^:]:%[^:]:\n", database_array[i].user, database_array[i].password);
database_array[i].iswritten = 1;
i++;
if (i > 20*n) {
n++;
struct database *new_database_array = realloc(database_array, sizeof(struct database)*(20*n));
database_array = new_database_array;
}
}
database_array[++i].iswritten = 0;
fclose(dbase);
return database_array;
}
我试着阅读其他解释,但我不明白这里出了什么问题
我分配给calloc的数组最初是20。然后,当它被填满时,我希望它的大小加倍,所以我使用n,它是2,乘以20,所以是40
令人沮丧的是,我尝试用一个更简单的程序重新分配一个struct数组,并且做同样的事情没有任何问题:
#include <stdio.h>
#include <stdlib.h>
struct prova {
int a;
int b[10];
};
int main() {
struct prova* array_struct = calloc(10, sizeof(struct prova));
array_struct[0].a = 2;
struct prova* tmp = realloc(array_struct, sizeof(struct prova) * 20);
free(array_struct);
array_struct = tmp;
array_struct[1].b[1] = 3;
printf("a = %d", array_struct[0].a);
printf("b = %d\n", array_struct[1].b[1]);
return 0;
}
#包括
#包括
结构prova{
INTA;
int b[10];
};
int main(){
struct prova*array_struct=calloc(10,sizeof(struct prova));
数组_结构[0].a=2;
struct prova*tmp=realloc(数组_struct,sizeof(struct prova)*20);
自由(数组结构);
数组结构=tmp;
数组结构[1].b[1]=3;
printf(“a=%d”,数组结构[0].a);
printf(“b=%d\n”,数组结构[1].b[1]);
返回0;
}
我没有看到什么?(请不要介意我没有检查realloc是否返回NULL,我稍后会添加)
你不能既重新分配又取消分配。您可以选择其中一种,但一旦选择了其中一种,以前的分配就不再存在,因此您不能选择另一种
在上面的第一行代码之后,不应再使用
数据库\u数组的值,因为它可能无效。请正确格式化代码。如果realloc
,请不要释放原始指针。struct prova*tmp=realloc(array\u struct,sizeof*tmp*20)代码>@AlexD谢谢你的帮助suggestion@Paul您应该在课程结束时释放
重新分配的块。但目前发生的是未定义的行为。(如果realloc
返回与其参数相同的指针,则在使用之前将其释放)。甚至没有它也不行。@Paul完全有可能你有不止一个bug。但你必须先解决最严重的问题,那是灾难性的。(你在main
中也有同样的错误。你甚至不能分析代码,因为它有那么严重的错误。)我测试了这个程序,它确实有效。我是说,如果有什么虫子我就看不见了。如果我不重新定位数组,它会工作得很好(但我必须为数组设置一个大小)。如果我试图重新分配它,它就会崩溃。所以我认为问题在于那次电话。
struct database *new_database_array = realloc(database_array, sizeof(struct database)*(20*n));
free(database_array);