结构数组上的realloc()给出了无效的下一个大小

时间:2015-06-30 22:54:47

标签: 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, 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,我稍后会添加)

1 个答案:

答案 0 :(得分:2)

struct database *new_database_array = realloc(database_array, sizeof(struct database)*(20*n));
free(database_array);

你不能同时重新分配某些东西并解除分配。您可以这样做,但是一旦完成,之前的分配就不再存在,所以你不能做另一个。

在上面的第一行代码之后,不应再使用database_array的值,因为它可能无效。