C学习:动态申请二维数组的方法

C学习:动态申请二维数组的方法

C学习:动态申请二维数组的方法 二维数组动态申请 三维数组动态申请 附:C代码在线调试工具

一般二维数组初始化时维数都是常量。所谓动态申请二维数组,即在某些场合,需要在程序运行阶段才能知道二维数组的行数和列数,从而在堆中动态分配内存给二维数组,此时维数为变量。

二维数组动态申请 以下实现思路也可以推广至动态申请三维、四维数组等。另外注意使用完数组后,不需要该数组时记得及时释放对应内存,话不多说,直接上代码:

// 动态申请二维数组空间的方法

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;

}

相关推荐

骨质疏松到底怎么诊断?药物怎么选?何时用? 这篇文章讲全啦!
基金怎么看走势图技巧?怎么选合适的买卖时机?
mobile365体育投注官网

基金怎么看走势图技巧?怎么选合适的买卖时机?

📅 10-21 👁️ 4266
影之刃满级后的玩法攻略
Bet体育365第二次提款要多久

影之刃满级后的玩法攻略

📅 07-30 👁️ 8075
Java中的分布式(概念说明)
365bet手机版下载

Java中的分布式(概念说明)

📅 10-14 👁️ 7279
生性凶猛且剧毒的眼镜王蛇的5大天敌,被第三种咬上一口必死!
Bet体育365第二次提款要多久

生性凶猛且剧毒的眼镜王蛇的5大天敌,被第三种咬上一口必死!

📅 08-20 👁️ 5971
听书必备这6款软件!
mobile365体育投注官网

听书必备这6款软件!

📅 07-08 👁️ 9818
投影幕布怎么清洗,老司机教你如何正确的清理投影幕布
ANONYMOUSLY中文(简体)翻译:剑桥词典
365bet手机版下载

ANONYMOUSLY中文(简体)翻译:剑桥词典

📅 08-28 👁️ 1914
介于一般和糟糕之间:文石 Tab Ultra C Pro 测评
Bet体育365第二次提款要多久

介于一般和糟糕之间:文石 Tab Ultra C Pro 测评

📅 10-02 👁️ 780