2012-10-18 75 views
1

可能重複:
How do I correctly set up, access, and free a multidimensional array in C?2D陣列動態存儲器分配崩潰

我試圖動態地分配存儲器使用釋放calloc 2D陣列。列固定爲2,因此它只有動態的行。

這是我一直在努力:

unsigned int **pts, rows; 
int main() 
{ 
    //some code 

    pts = (unsigned int **)calloc(2*rows, sizeof (unsigned int **)); 
} 


//The code to access the array : 
for(k=1;k<=i;k++) 
{ 
    printf("\nX%d=",k); 
    scanf("%d",&pts[k][0]); 
    printf("\nY%d=",k); 
    scanf("%d",&pts[k][1]); 
} 

但問題是,在訪問陣列,程序崩潰。 我在MinGW GCC中使用Eclipse。

請讓我知道如果我需要在這裏提供更多的數據或給我一些想法我可以如何處理這個,因爲這是我的第一篇文章。

+2

[我如何在C中正確設置,訪問和釋放多維數組?](http://stackoverflow.com/questions/12462615/how-do-i-correctly-set-up-access-and -free -a-multidimensional-array-in-c) – Lundin

+0

你可以在你訪問數組的地方發佈代碼嗎? – CCoder

回答

2

鐸的答案是正確的解決方案。 但提供更多的洞察,爲什麼你的代碼是錯誤的....

你的代碼實際上是做的只是分配一個數組,長度2 *行的指針指向int類型的指針。

你正在嘗試創建是這樣的:

an array of int** -> int* -> int 
          -> int 
          -> int 
          -> ...more 
        -> int* -> int 
          -> int 
          -> int 
          -> ...more 
        -> int* -> int 
          -> int 
          -> int 
          -> ...more 
        -> ...more 

什麼,你實際上已經創建了是這樣的:

an array of int** -> int* -> nothing (null address) 
        -> int* -> nothing... 
        -> ...more 

然後嘗試一個int分配給地址之一通過零初始化int *指定的數組int **(您會看到,calloc已確保您的所有INT *的是零)

當你試圖執行

scanf("%d",&pts[k][0]); 

PTS [K]是指第(k - 1)個元素的的INT陣列中**,但如上所示,儘管您的代碼確實爲該元素分配了空間,但它已將其初始化爲零。所以,這個pts [k]指向NULL。所以scanf已經獲得了一個基於NULL地址的零偏移的地址......現在應該清楚這是無效的。

+0

Thans爲清晰的圖片! – Nik

+0

@Nik,不客氣。我記得在我大學第一年的時候犯了同樣的錯誤......洛茲 –

1

下面是做到這一點的方式:

pts = (unsigned int **)calloc(rows, sizeof (unsigned int *)); 
for(int i = 0; i < rows; i++) { 
    pts[i] = (unsigned int *)calloc(2, sizeof (unsigned int)); 
} 
+0

謝謝都鐸王朝!還有一個問題。不能我寫2 *行並使用calloc只有一次? – Nik

+0

@Nik:不是,如果你使用指向指針的指針,你需要分別分配每一行。 – Tudor

+0

再次感謝。我需要學習更多:) – Nik