2017-08-05 132 views
0

解決*****請參考BLUEPIXY簡評供液*****動態內存分配

我想在C https://leetcode.com/problems/pascals-triangle/description/

解決本文給出了問題

這是我解決問題的方法。 我認爲解決方案沒有問題,但動態分配內存對於2D array變得非常複雜。有人可以幫我弄清楚如何正確地分配內存到2D array。更新了基於BLUEPIXY建議的代碼,我似乎仍然遇到了運行時錯誤。

/** 
* Return an array of arrays. 
* The sizes of the arrays are returned as *columnSizes array. 
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free(). 
*/ 
int** generate(int numRows, int** columnSizes) { 


    int i=0,j=0,numColumns =2; 

    columnSizes = (int **)malloc(numRows * sizeof(int *)); 
    for (i=0; i<numRows; i++) 
     columnSizes[i] = (int *)malloc(sizeof(int)); 

    int **returnArray = (int **)malloc(numRows * sizeof(int *)); 
    for (i=0; i<numRows; i++) 
     returnArray[i] = (int *)malloc((i+1) * sizeof(int)); 


    returnArray[0][0] = 1; 
    *columnSizes =1; 
    for(i=1;i<numRows;i++) 
    { 
     for(j=0;j<numColumns;j++) 
     { 
      if(j==0) 
       columnSizes[i][j] = returnArray[i-1][j]; 
      else if(j==(numColumns-1)) 
       columnSizes[i][j] = returnArray[i-1][j-1]; 
      else 
       returnArray[i][j] = returnArray[i-1][j-1] + returnArray[i-1][j]; 

      numColumns++; 
     } 
     *(columnSizes+i) = numColumns-1; 
    } 

    return returnArray; 
} 
+0

需要爲每行更改(增加)numColumns。 – BLUEPIXY

+0

您還誤解了'generate'函數的需求規格。 – BLUEPIXY

+0

@BLUEPIXY:哦,是的,謝謝你,我把它寫在我的筆記本上。錯過了輸入。感謝您指出。儘管我仍然遇到錯誤。我會盡力弄清楚什麼是錯的。你有沒有看到我分配內存的方式有什麼問題? – CodeModeOn

回答

0

問題

(1)

columnSizes = (int **)malloc(numRows * sizeof(int *)); 
for (i=0; i<numRows; i++) 
    columnSizes[i] = (int *)malloc(sizeof(int)); 

應該

*columnSizes = malloc(numRows * sizeof(int)); 

(※沒有必要從void *用C投)。

(2)

*columnSizes =1;//type of `*columnSizes` is `int *` 

應該是

**columnSizes = 1;//meant columnSizes[0] = 1; at caller side (main) 

(3)

columnSizes[i][j] = returnArray[i-1][j]; 
... 
columnSizes[i][j] = returnArray[i-1][j-1]; 

應該是

returnArray[i][j] = returnArray[i-1][j]; 
... 
returnArray[i][j] = returnArray[i-1][j-1]; 

因爲這是錯字。

(4)

numColumns++;移動到後for(j=0;j<numColumns;j++){ }

(5)

*(columnSizes+i) = numColumns-1; 

應該是

*(*columnSizes+i) = numColumns-1;//For reasons similar to (2) 

整個修復代碼:

int** generate(int numRows, int** columnSizes) { 
    int i=0,j=0,numColumns =2; 

    *columnSizes = malloc(numRows * sizeof(int)); 

    int **returnArray = (int **)malloc(numRows * sizeof(int *)); 
    for (i=0; i<numRows; i++) 
     returnArray[i] = (int *)malloc((i+1) * sizeof(int)); 

    returnArray[0][0] = 1; 
    **columnSizes = 1; 
    for(i=1;i<numRows;i++) 
    { 
     for(j=0;j<numColumns;j++) 
     { 
      if(j==0) 
       returnArray[i][j] = returnArray[i-1][j]; 
      else if(j==(numColumns-1)) 
       returnArray[i][j] = returnArray[i-1][j-1]; 
      else 
       returnArray[i][j] = returnArray[i-1][j-1] + returnArray[i-1][j]; 
     } 
     numColumns++; 
     *(*columnSizes+i) = numColumns-1; 
    } 

    return returnArray; 
} 
+0

非常感謝BLUEPIXY,這讓我對一切都非常瞭解。 – CodeModeOn

+0

不用客氣。 – BLUEPIXY

0

只是這樣做

int *arr = (int *)malloc(r * c * sizeof(int)); 

,並訪問元素這樣

int i, j, count = 0; 
    for (i = 0; i < r; i++) 
     for (j = 0; j < c; j++) 
     *(arr + i*c + j) = ++count; 

OR

如果你有指針的指針,然後你從這個代碼獲得一些幫助

int main() 
{ 
    int i,j; 
    int **p; 
    (p)=(int**)malloc(5*sizeof(int*)); 

    for(i=0;i<5;i++) 
    *(p+i)=(int*)malloc(4*sizeof(int)); 

    for(i=0;i<5;i++) 
    for(j=0;j<4;j++) 
    p[i][j]=2; 

    for(i=0;i<5;i++) 
    for(j=0;j<4;j++) 
    printf("%d",p[i][j]); 
} 
+0

Hi Tanuj,謝謝你的迴應。我注意到你在這裏提供的解決方案:http://www.geeksforgeeks.org/dynamically-allocate-2d-array-c/但在我的情況下,Leetcode函數的輸入參數是一個指向指針的指針。這就是爲什麼我使用指向指針的指針分配內存的原因,第三個解決方案在同一個geeksforgeeks鏈接中。雖然似乎不適合我。當我返回時,它打印出一組空數組。 – CodeModeOn

+0

@CodeModeOn看到我更新的答案。 –

+0

感謝您的解決方案。我沒有看到你的更新動態分配方法與我原來的文章相比有什麼區別。我仍然嘗試在Leetcode鏈接中插入您的解決方案,並將所有元素指定爲值2以用於測試目的。它仍然給我5個NULL數組作爲輸出。 – CodeModeOn

0

如果您爲編程練習所做的所有工作都打印出結果,爲什麼還要打擾任何存儲?只需在這裏使用解決方案。

How to efficiently calculate a row in pascal's triangle?

關於多維數組和C,存在對這樣的事情沒有本地支持。因此,您必須使用一個或多個一維存儲和技巧來建立自己的索引,以便將索引存入該存儲。

最簡單的事情,@ tanuj-yadav建議大多數二維數組的工作正常,只是分配一個nXm長度的存儲塊並做非常簡單的索引算術arr [i * c + j]。

另一種常見的方法是陣列數組(又名破碎陣列)。這就像列表清單一樣,並且每行(或列)都用malloc完成。新版本