📜  如何在C中动态分配2D数组?

📅  最后修改于: 2021-05-25 22:18:04             🧑  作者: Mango

以下是在堆上创建2D数组(或动态分配2D数组)的不同方法。

在以下示例中,我们将“ r ”视为行数,将“ c ”视为列数,并创建了一个二维数组,其中r = 3,c = 4,并遵循以下值

1  2  3  4
  5  6  7  8
  9  10 11 12 

1)使用单个指针:
一种简单的方法是使用简单的指针算法分配大小为r * c的存储块和访问元素。

#include 
#include 
  
int main()
{
    int r = 3, c = 4;
    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;
  
    for (i = 0; i <  r; i++)
      for (j = 0; j < c; j++)
         printf("%d ", *(arr + i*c + j));
  
   /* Code for further processing and free the 
      dynamically allocated memory */
    
   return 0;
}

输出:

1 2 3 4 5 6 7 8 9 10 11 12

2)使用指针数组
我们可以创建大小为r的指针数组。请注意,从C99开始,C语言允许使用可变大小的数组。创建指针数组后,我们可以为每行动态分配内存。

#include 
#include 
  
int main()
{
    int r = 3, c = 4, i, j, count;
  
    int *arr[r];
    for (i=0; i

输出:

1 2 3 4 5 6 7 8 9 10 11 12

3)使用指向指针的指针
我们还可以使用双指针动态创建指针数组。一旦我们动态分配了数组指针,就可以像方法2一样为每行动态分配内存。

#include 
#include 
  
int main()
{
    int r = 3, c = 4, i, j, count;
  
    int **arr = (int **)malloc(r * sizeof(int *));
    for (i=0; i

输出:

1 2 3 4 5 6 7 8 9 10 11 12

4)使用双指针和一个malloc调用

#include
#include
  
int main()
{
    int r=3, c=4, len=0;
    int *ptr, **arr;
    int count = 0,i,j;
  
    len = sizeof(int *) * r + sizeof(int) * c * r;
    arr = (int **)malloc(len);
  
    // ptr is now pointing to the first element in of 2D array
    ptr = (int *)(arr + r);
  
    // for loop to point rows pointer to appropriate location in 2D array
    for(i = 0; i < r; i++)
        arr[i] = (ptr + c * i);
  
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            arr[i][j] = ++count; // OR *(*(arr+i)+j) = ++count
  
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            printf("%d ", arr[i][j]);
  
    return 0;
}

输出:

1 2 3 4 5 6 7 8 9 10 11 12

感谢Trishansh Bhardwaj提出了第四种方法。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。