目录
解题思路
步骤一:开辟空间
步骤二:使用空间
步骤三:释放空间
图解
完整代码展示:注意看注释
在C语言编程中,处理多维数据结构时,我们通常会遇到二维数组。然而,对于特定大小或需要动态调整的情况,静态定义的二维数组可能无法满足需求。这时,我们需要借助动态内存分配来创建和管理二维数组。本篇博客将详细解析如何使用malloc()
函数动态创建一个二维数组,并在使用完毕后正确释放其内存。我们将通过一个具体的代码示例来展示这一过程,同时阐述解题思路。
解题思路
步骤一:开辟空间
首先,我们需要为二维数组的每一行(即第一维)分配内存。这里,我们希望创建一个3行5列的二维数组。因此,我们声明一个指针int** p
,它将指向一个包含3个元素的指针数组,每个元素又分别指向一个包含5个整数的数组。
int** p = (int**)malloc(3 * sizeof(int*));
这段代码使用malloc()
函数为p
分配了足够容纳3个int*
指针的空间。注意类型转换为(int**)
,确保p
可以存储指针数组。
接下来,我们需要为每一行(即第二维)分配内存。在循环中,为p
的每个元素(即每行)分配一个能容纳5个整数的空间:
for (int i = 0; i < 3; i++)
{p[i] = (int*)malloc(5 * sizeof(int));
}
此处的malloc()
调用为p[i]
分配了5个int
大小的内存,并将其地址赋值给p[i]
。注意这里应分配sizeof(int)
而非sizeof(int*)
,因为我们实际存储的是整数而非指针。
步骤二:使用空间
有了已分配的内存,我们可以像操作普通二维数组一样对动态数组进行赋值和访问。在嵌套循环中,遍历所有元素并为其赋值,然后打印出来:
for (int i = 0; i < 3; i++)
{for (int j = 0; j < 5; j++){p[i][j] = i * 5 + j;printf("%d\t", p[i][j]);}printf("\n");
}
这里,我们按照i * 5 + j
的公式为每个元素赋值,以直观地展示其位置关系。每次内层循环结束后打印换行符,以便在输出中区分不同的行。
步骤三:释放空间
使用完动态数组后,务必对其进行内存释放,防止内存泄漏。由于我们分两步进行了内存分配,释放时也需按照逆序进行:
- 先释放每一行(第二维)的内存:
for (int i = 0; i < 3; i++)
{free(p[i]);
}
- 再释放整个数组(第一维)的内存:
free(p);
最后,将指针p
置为NULL
,这是一个良好的编程习惯,有助于避免后续误用已释放的内存:
p = NULL;
图解
完整代码展示:注意看注释
int main() {//开辟空间int** p = (int**)malloc(3 * sizeof(int*));//int *(*p) 行if (p == NULL){assert(p);}for (int i = 0; i < 3; i++){p[i] = (int*)malloc(5 * sizeof(int*));//列if (p == NULL){assert(p);}}//使用空间for (int i = 0; i < 3; i++){for (int j = 0; j < 5; j++) {p[i][j] = i * 5 + j;//给二维数组赋值//0*5+0 0*5+1 0*5+2 ....printf("%d\t", p[i][j]);}printf("\n");}//释放空间//由于开辟了两次空间for (int i = 0; i < 3; i++){free(p[i]);}free(p);p == NULL;return 0;
}