2017-10-18 121 views
2

everyone: 我剛剛遇到了一種在C中分配二維矩陣的方法。在練​​習時,我對一個未知的bug感到困惑。動態分配2D空間的內存管理

這裏是函數,第一個版本:

//first version 
static int ** my2DAlloc(int rows, int cols){ 
    int ** array; 
    int * array_head; 
    int i; 
    int len = sizeof(int*)*rows + sizeof(int)*rows*cols + 1; 
    array = (int**)malloc(len); 
    memset(array, 0, len); 

    array_head = (int *) (array + rows); 
    for(i=0; i<rows; i++) 
     array[i] = array_head + i*cols ; 

    return array; 
} 

我沒有這個版本的任何問題。不過,我試圖改變代碼一點,如下所示:

//second version 
static int ** my2DAlloc(int rows, int cols){ 
    int ** array; 
    int * array_head; 
    int i; 
    int len = sizeof(int*)*rows + sizeof(int)*rows*cols + 1; 
    array = (int**)malloc(len); 
    memset(array, 0, len); 

    //array_head = (int *) (array + rows); 
    for(i=0; i<rows; i++) 
     array[i] = (int *) (array + rows + i*cols); // <--- the major difference 

    return array; 
} 

對此第二個版本,它似乎罰款將數據寫入到矩陣和讀取數據了。 但是,當我嘗試釋放分配的空間,我得到系統錯誤,如:

free(): invalid next size (fast): 0x00000000020df010 

這似乎是一些內存錯誤。但我無法弄清楚這個問題。 任何人都可以幫我嗎?

感謝&問候

+0

你如何寫你釋放空間的代碼行? –

+0

'array'是'int **'。 'array_head'是'int *'。兩者都不同。 – BLUEPIXY

+0

你真的打算返回一個指向int指針的指針嗎?在中,你在尋找一個int指針數組嗎? – jwdonahue

回答

3

在第二個版本的問題是,你正在做上int **而不是int *指針運算,因爲你有算術外投。

for(i=0; i<rows; i++) 
    array[i] = ((int *)(array + rows) + i*cols); // <--- the major difference 
+0

嗨,巴爾馬,你是對的,謝謝你指出的問題。 – MyCoy