一般二维数组初始化时维数都是常量。所谓动态申请二维数组,即在某些场合,需要在程序运行阶段才能知道二维数组的行数和列数
,从而在堆中动态分配内存给二维数组,此时维数为变量。
二维数组动态申请
以下实现思路也可以推广至动态申请三维、四维数组等。另外注意使用完数组后,不需要该数组时记得及时释放对应内存,话不多说,直接上代码:
// 动态申请二维数组空间的方法
int main(void)
{
int a[5][3] = {
{
1,4,-1},{
3,2,3},{
3,3,-2},{
1,1,1},{
4,0,1}};
int row = 2;
int col = 2;
// 申请指向行首指针的二级指针空间
int **arr2 = (int **)malloc(row * sizeof(int**));
int i, j;
for (i = 0; i < row; i++) {
// 得到行首指针,注意相邻行的内存空间不一定连续
// 但同一行内部元素的内存空间是连续的
arr2[i] = (int*)malloc(col * sizeof(int));
}
// 录入数据
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
// arr2[i][j] = a[i][j]; // 快速录入预设数据
int ret = scanf("%d", &arr2[i][j]);
if (ret != 1) {
return -1; }
}
}
// 打印输入的数组
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%d ", arr2[i][j]);
}
printf("\n");
}
// 释放对应内存
for (i = 0; i < row; i++) {
free(arr2[i]);
}
free(arr2);
return 0;
}
三维数组动态申请
扩展深入,以下给出动态申请三维数组并初始化的方法,三维数组实际应用不多,仅供参考加深理解,欢迎读者自行实现:
// 动态申请三维数组空间,三维数组用的不多
int main(void)
{
int a[2][5][3] = {
{
{
1,4,-1},{
3,2,3},{
3,3,-2},{
1,1,1},{
4,0,1}},
{
{
2,3,4},{
5,6,7},{
3,3,-2},{
1,2,1},{
4,5,1}} };
int num = 2; // num of 2D matrix
int row = 5;
int col = 3;
// 申请指向不同二维数组指针的三级指针空间和对应二维数组空间
int ***arr3 = (int ***)malloc(num * sizeof(int***));
int i, j;
for (i = 0; i < num; i++) {
arr3[i] = (int **)malloc(row * sizeof(int**));
for (j = 0; j < row; j++) {
arr3[i][j] = (int*)malloc(col * sizeof(int));
}
}
// 录入数据
int k;
for (i = 0; i < num; i++) {
for (j = 0; j < row; j++) {
for (k = 0; k < col; k++) {
arr3[i][j][k] = a[i][j][k]; // 快速录入预设数据
// int ret = scanf("%d", &arr3[i][j][k]);
// if (ret != 1) { return -1; }
}
}
}
// 打印输入的数组
for (i = 0; i < num; i++) {
printf("2D Matirx Num: %d\n", i + 1);
for (j = 0; j < row; j++) {
for (k = 0; k < col; k++) {
printf("%d ", arr3[i][j][k]);
}
printf("\n");
}
}
// 释放对应内存
for (i = 0; i < num; i++) {
for (j = 0; j < row; j++) {
free(arr3[i][j]);
}
free(arr3[i]);
}
free(arr3);
return 0;
}