C语言中2D数组的动态内存分配

时间:2017-08-05 04:51:47

标签: c memory dynamic

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

这是我解决问题的方法。 我不认为解决方案存在问题,但// Read data using username and password public function login($username, $password) { $this->db->select('username'); $this->db->from('user_register'); $this->db->where(array('username' => $username, 'password' => $password)); $query = $this->db->get(); $user_data = $query->row_array(); if ($query->num_rows() == 1) { return user_data; } else { return false; } } 动态分配内存变得非常复杂。有人可以帮我弄清楚如何正确地将内存分配给2D array。根据BLUEPIXY建议更新了代码,我似乎仍然遇到运行时错误。

2D array

3 个答案:

答案 0 :(得分: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;



如果你有指向指针的指针,那么你可以从这段代码获得一些帮助

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

答案 1 :(得分:0)

如果你需要为编程练习做的就是打印结果,为什么还要打扰任何存储?在这里使用解决方案。

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

关于多维数组和C,没有这种东西的原生支持。因此,您必须使用一个或多个1-D存储块和技巧来构建自己的存储和技巧,以便为该存储建立索引。

最简单的事情,@ tanuj-yadav建议适用于大多数2-d数组,只需分配一个nXm长度的存储块,并进行非常简单的索引算法arr [i * c + j]。

另一种常见的方法是数组数组(也称为不规则数组)。这就像一个列表列表,并且每行(或列)都使用malloc天真地完成。

答案 2 :(得分: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));

(※没有必要从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;
}