为什么realloc()会崩溃我的程序?

时间:2016-11-13 00:14:18

标签: c arrays malloc realloc

我试图通过realloc动态调整数组大小。使用malloc在我的函数外部初始化此数组。

这是我的功能:

size_t verarbeite_anlagendatei(ANLAGE *anlage_arr) {    
    FILE *fp;
    ANLAGE anlage;

    fp = fopen("anlagen.dat", "r");

    if(fp == NULL) {
        printf("Anlagedatei existiert nicht. Bitte mit Menuepunkt (0) weiter machen.\n");
        return 0;
    }

    int index = 0;
    size_t size = 1;

    while(fscanf(fp, "%d %s %s %f %d %d",   
                &anlage.InventarNr, 
                anlage.Anlagenbez, 
                anlage.Standort, 
                &anlage.Basiswert, 
                &anlage.Nutzdauer, 
                &anlage.AnschJahr) != EOF) {
        if(index > 0) {
            size++;
            realloc(anlage_arr, size * sizeof(ANLAGE));
        }
        anlage_arr[index] = anlage;
        index++;
    }
    return size;    
}

我知道我必须初始化一个指向ANLAGE类型的新指针,并在调用NULL后检查它是否为realloc,但由于此函数总是崩溃程序,我在这种情况下,我已经跳过了它。

1 个答案:

答案 0 :(得分:2)

除了上面评论中提到的许多细节之外,您还需要注意realloc返回指向它已分配的内存块的指针,它可能与指针不在同一位置它已通过。换句话说,在调用realloc之后,指针所指向的原始内存(在这种情况下,anlage_arr)可能已被释放,并且realloc返回的指针必须用于访问重新分配的内存。

我建议您可能需要按如下方式重写您的功能:

size_t verarbeite_anlagendatei(ANLAGE **p_anlage_arr) {    
    FILE *fp;
    ANLAGE anlage;

    fp = fopen("anlagen.dat", "r");

    if(fp == NULL) {
        printf("Anlagedatei existiert nicht. Bitte mit Menuepunkt (0) weiter machen.\n");
        return 0;
    }

    int index = 0;
    size_t size = 1;

    while(fscanf(fp, "%d %s %s %f %d %d",   
                &anlage.InventarNr, 
                anlage.Anlagenbez, 
                anlage.Standort, 
                &anlage.Basiswert, 
                &anlage.Nutzdauer, 
                &anlage.AnschJahr) != EOF) {
        if(index > 0) {
            size++;
            *p_anlage_arr = realloc(*p_anlage_arr, size * sizeof(ANLAGE));
        }
        (*p_anlage_arr)[index] = anlage;
        index++;
    }
    return size;    
}

对此函数的调用看起来像

ANLAGE *anlage_arr;
size_t sz;

anlage_arr = malloc(sizeof(ANLAGE));

sz = verarbeite_anlagendatei(&anlage_arr);

祝你好运。