📜  2D 的动态内存分配 - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:59:04.619000             🧑  作者: Mango

2D 的动态内存分配 - C 编程语言

在 C 语言中,我们可以使用指针和动态内存分配来声明 1 维数组,但如果想要声明 2 维及以上的数组,则需要使用特定的方法。下面将简单介绍一下如何进行动态内存分配来声明 2D 数组。

二维数组的定义和初始化

先来回顾一下静态定义二维数组的方法:

int a[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

以上代码定义并初始化了一个 2 × 3 的二维数组,我们可以对其进行访问和修改。

而对于动态定义二维数组,则需要进行以下步骤:

  1. 先分配一个能存放指针的一维数组,这个一维数组的大小为行数;
  2. 遍历一维数组,对每一个元素再分配一个能存放具体数据的一维数组,这个一维数组的大小为列数。

这个过程可以使用指针来实现:

int **arr;
arr = (int **)malloc(sizeof(int *) * row);
for (int i = 0; i < row; i++) {
    arr[i] = (int *)malloc(sizeof(int) * col);
}

// 初始化
for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
        arr[i][j] = 0;
    }
}

以上代码就动态定义了一个大小为 row × col 的二维数组,接下来详细解释一下每一部分的含义。

二维数组的动态分配

先来看第一步,分配能存放指针的一维数组。我们先定义一个 int 型的二级指针 arr,它指向的是一个存放 int 型指针的一维数组。因此动态分配的大小应该是 sizeof(int *) * row,即分配能够存放 row 个 int 型指针的空间。

int **arr;
arr = (int **)malloc(sizeof(int *) * row);

这里需要注意的是,在分配完内存后需要进行检查,确保内存分配成功。如果分配失败,malloc 函数会返回空指针,我们需要及时处理这个错误:

int **arr;
arr = (int **)malloc(sizeof(int *) * row);
if (arr == NULL) {
    // 分配失败
    exit(1);
}

第二步是在一维数组中分配每一行的空间,我们可以使用同样的方法:先分配能够存放具体数据(即 int 型变量)的一维数组,再将其赋值给指针数组中的每一个元素。

for (int i = 0; i < row; i++) {
    arr[i] = (int *)malloc(sizeof(int) * col);
}

这样每一行就都动态分配好了,现在我们可以对二维数组进行操作。

二维数组的访问

二维数组访问的方法在静态数组和动态数组中并没有区别。我们可以使用下标访问二维数组中的每一个元素:

arr[0][0] = 1;
arr[1][2] = 2;
二维数组的释放

由于二维数组是动态分配的,因此在使用完后需要手动释放内存。释放的顺序应该和分配的顺序相反:先释放每个一维数组,然后释放指针数组本身。

for (int i = 0; i < row; i++) {
    free(arr[i]);
}
free(arr);
总结

动态分配二维数组需要三步操作:

  1. 先动态分配一个能存放指针的一维数组,分配的大小为 sizeof(int *) * row;
  2. 遍历指针数组,分别动态分配每一行的空间,大小为 sizeof(int) * col;
  3. 对分配好的二维数组进行操作,完成后先释放每行的空间,然后释放指针数组本身。

以上就是动态分配二维数组的基本操作了,希望能对大家有所帮助。