2015-04-28 68 views
1

我有一個函數在執行過程中被調用了很多次。在這個函數中我分配數組:在一個函數中分配內存,然後釋放它

double **MUDG_table; 

//dynamic allocate array of MUDG_table (1st Dimension) 
MUDG_table = calloc(arr_row,sizeof(double *)); 

//check if the memory has been allocated correctly 
if (MUDG_table==NULL) 
{ 
    printf("Error allocating memory!\n"); //print an error message 
    return 1; //return with failure 
} 

for (cv02=0;cv02<arr_row;cv02++) 
{ 
    MUDG_table[cv02] = calloc(arr_column, sizeof(double)); 

    //check if the memory has been allocated correctly 
    if (MUDG_table[cv02]==NULL) 
    { 
     printf("Error allocating memory!\n"); //print an error message 
     return 1; //return with failure 
    } 
} 

當我與計算並返回我想要的值之前完成我嘗試以釋放內存:

//free memory 
for (cv02=0;cv02<arr_row;cv02++) 
{ 
    free(MUDG_table[cv02]); 
} 
free(MUDG_table); 

和崩潰。

如果我刪除它,它會工作幾次(正如我所說的函數在循環中每次調用多次不同的參數),然後它崩潰。有任何想法嗎?

+1

請填寫數據並釋放它之間的代碼。你爲什麼使用'calloc()'你用'0'留下很多值? –

+0

@iharob您是否建議嘗試使用malloc?到目前爲止,我所有的數組都使用calloc,而且我沒有問題。 – kat

+7

如果你不叫計算部分,它也會崩潰嗎?如果不是,那麼你可能在計算部分的某個地方有緩衝區溢出/下溢。順便說一下'calloc'確定。無需將'calloc'改爲'malloc'。 –

回答

1

您尚未提供足夠的信息來確定導致錯誤的原因,因爲您提供的代碼看起來一切正常。很可能有一個或多個指針遭到破壞,或者在分配和釋放之間增加了這一點。

但是,您可能會比您需要做的更麻煩。 IF

  • 程序可以依靠是在C99的新功能,並
  • 您的陣列的尺寸並不需要包含它的功能中的任何一個運行過程中改變(即不存在重新分配)

那麼這將是更簡單的使用一個可變長度數組:

double MUDG_table[arr_row][arr_column]; 

不會necessar ily解決你的的問題,但它肯定會簡化你的代碼,並且可能更容易識別根本問題。

+0

@ John Bollinger問題在於:[link](http://stackoverflow.com/questions/29897609/c-programming-read-double-numbers-from-text-file-逐行到二維數組/ 29913737#29913737)while while tok!= NULL。我增加列數比我應該多。 – kat

+0

據我所知,所寫的函數滿足了我使用VLA的標準。如果輸入行包含的數字超出您的預期,那麼您至少有三種選擇:忽略超出的值,失敗或重新分配以騰出更多空間。最後一個VLA是不可能的。但是,您可以分配一個足夠大的數組來保存任何可能的結果。在您引用的代碼的情況下,您無法從1024字節緩衝區解析超過512個以空格分隔的數字。 –