我有这个功能。正如你所看到的,一切都在函数中完成,我没有在main中分配然后传递任何东西(我只会在函数完成后返回指向数组的指针)。该函数本身(具有固定的数组大小)有效,但realloc失败。
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;
}
我没看到什么? (请不要理会我没有检查realloc是否返回NULL,我稍后会添加)
答案 0 :(得分:2)
struct database *new_database_array = realloc(database_array, sizeof(struct database)*(20*n));
free(database_array);
你不能同时重新分配某些东西并解除分配。您可以这样做,但是一旦完成,之前的分配就不再存在,所以你不能做另一个。
在上面的第一行代码之后,不应再使用database_array
的值,因为它可能无效。