C语言中二维数组的动态内存分配

代码模式开启

我正在尝试用 C 解决 Leetcode 问题。https://leetcode.com/problems/pascals-triangle/description/

这是我对问题的解决方案。我认为解决方案没有问题,但是为 a动态分配内存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;
}
蓝精灵

新版本问题

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章