2016-11-13 181 views
1

我正在嘗試通過使用realloc來動態調整數組的大小。這個數組在我的函數之外使用malloc初始化。爲什麼realloc()會導致我的程序崩潰?

這裏是我的功能:

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類型並檢查它是否我呼籲realloc後的NULL,但因爲這個函數總是導致程序崩潰,我在這種情況下,它跳過了它。

+0

你確定是realloc導致崩潰而不是後面的行嗎?你可以在你的問題中添加一個gdb回放的崩潰嗎? – gowrath

+0

anlage_arr甚至在任何時候都是malloc ed? – gowrath

+0

我已經檢查了printf()行,如果它真的是realloc(),崩潰的程序,它確實是。 – djafix

回答

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); 

好運。

+0

謝謝!它像這樣工作:)就像我說的那樣:作爲一名java開發人員,在開始理解指針問題時真的很難,但現在我有一個「模板」,它可以真正幫助我繼續進行C開發......謝謝! – djafix

相關問題