簡體   English   中英

用C語言為2D數組分配動態內存

[英]Dynamic Memory allocation for 2D Arrays in C Language

我試圖解決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;
}

做這個

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;

要么

如果您有指向該指針的指針,那么您將從此代碼中獲得一些幫助

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]);
}

如果您在編程工作中要做的就是打印出結果,那為什么還要打擾任何存儲呢? 只需在此處使用解決方案。

如何有效地計算帕斯卡三角形中的一行?

關於多維數組和C,不存在此類支持。 因此,您必須使用一個或多個一維存儲塊和一些技巧來建立該索引,以建立自己的存儲空間。

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

另一種常見的方法是數組的數組(又稱破爛數組)。 這就像一個列表列表,並且在每一行(或每一列)上都使用malloc天真地完成了操作。

新版本的問題

(1)

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

應該

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

(※不必從C中的void *強制轉換)。

(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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM