📅  最后修改于: 2023-12-03 14:59:04.619000             🧑  作者: Mango
在 C 语言中,我们可以使用指针和动态内存分配来声明 1 维数组,但如果想要声明 2 维及以上的数组,则需要使用特定的方法。下面将简单介绍一下如何进行动态内存分配来声明 2D 数组。
先来回顾一下静态定义二维数组的方法:
int a[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
以上代码定义并初始化了一个 2 × 3 的二维数组,我们可以对其进行访问和修改。
而对于动态定义二维数组,则需要进行以下步骤:
这个过程可以使用指针来实现:
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);
动态分配二维数组需要三步操作:
以上就是动态分配二维数组的基本操作了,希望能对大家有所帮助。