2016-01-31 35 views
-1

我已經包含在結構n內的二維int數組:使用C:程序崩潰設法釋放二維數組本身

float **matrix;

這是動態分配的:

n->matrix = (float**)malloc(n->rows * sizeof(float*)); 
for (i = 0; i < n->rows; i++) { 
    n->matrix[i] = (float*)malloc(n->columns * sizeof(float)); 
} 

哪裏n->rowsn->columns是事先定義的。

當談到解除分配,下面的函數:

void de_allocate(float** matrix, int nrows) { 
    int row; 
    for (row = 0; row < nrows; row++) { 
     free(matrix[row]); 
    } 
    free(matrix); 
} 

程序成功地打通解除分配過程中的for循環,但給HEAP CORRUPTION DETECTED [location of error]. CRT detected that the application wrote to memory after end of heap buffer

請注意,我只是試圖釋放內存爲n->matrix而不是結構本身。

它讓我覺得n->datafree()方法期望並嘗試寫入的長度不同,但我不太確定。

任何想法可能導致問題?

+0

這不是一個二維數組,而只是一個仿真而已。這樣的代碼屬於博物館。現在,你應該有一個兼容C99的編譯器,它能夠一次性分配2D,'float(* matrix)[nrows] = malloc(sizeof(float [ncols] [nrows]));'不需要'爲'循環和亂搞與幾個'免費'調用。 –

+0

@JensGustedt我在查找某個解決方案時看到過幾個問題完全相同的評論,但不幸的是,我不能使用C99編譯器,因爲它可能是痛苦的。 – user3893820

+0

問題中的代碼對我來說看起來沒問題。你有沒有嘗試使用valgrind進行更精確的調試? – immibis

回答

0

不知道究竟發生了什麼問題,可能很難追查。你可以做的是:

  1. 通過valgrind運行的應用程序 - 它會告訴你不僅發生的問題,也當/如何。

  2. 確保應用程序崩潰時,它確實奇怪 - -fsanitize=address-fsanitize=undefined可能會有所幫助。

+0

當我嘗試釋放數組本身(而不是它的元素)時發生問題,因爲它試圖在堆緩衝區。 – user3893820

+0

@ user3893820不完全。當你調用'free()'時看到的是一個早期發生的問題的副作用 - 寫在矩陣的分配數據上。要弄清楚爲什麼你會崩潰,你需要找到最初的寫作發生在哪裏並解決這個問題。 – viraptor

+0

我看@viraptor。奇怪的是,如果我在for循環中使用'calloc()'將元素初始化爲零,並且在嘗試釋放事物之前不更改值,那麼問題仍然會發生。 – user3893820