C Program进阶-二维数组动态内存开辟
对于二维数组,我们知道可以用Type ArrayName[Row][Colume]的方式来定义,这是一种静态内存开辟的方式,程序在编译的时候就为该数组分配了空间,而且行和列大小也是指定的。这篇文章里我们来看看二维数组动态内存开辟,开辟空间的大小是运行时才知道,这样可以更实现功能是可以更灵活。
首先我们来看看如何在内存上分配以实现二维数组的存储。
假如我们要实现一个3行4列,元素是int类型的二维数组,为了能像静态分配方式一样,使用两个下标i,j分别对应行列的方式访问二维数组,我们要如下分配空间:

对于这样一个内存布局,当我们要访问第i行第j列的元素,我们就可以像静态分配方式一样,利用p_array2d[i][j];
下面我们就针对这种方式来实现:
(1)初始化:
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#define ROW 3
#define COLUME 4 void main()
{
int **p_array2d = NULL;
p_array2d = (int **)malloc(sizeof(int *) * ROW);//分配的空间是行数,每一个空间对应指向行空间的第一个元素
assert(p_array2d != NULL);
for (int i = ; i < ROW; i++)
{
p_array2d[i] = (int *)malloc(sizeof(int) * COLUME);//为每一行分配空间,元素个数是列值
assert(p_array2d[i] != NULL);
}
}
(2)遍历赋值:
for (int i = ; i < ROW; i++)
{
for (int j = ; j < COLUME; j++)
{
p_array2d[i][j] = i + j; //可以像静态分配的方式访问,使用p_array2d[i][j]
}
}
(3)遍历打印:
for (int i = ; i < ROW; i++)
{
for (int j = ; j < COLUME; j++)
{
printf("%d ", p_array2d[i][j]);
}
printf("\n");
}
(4)释放空间:
for (int i = ; i < ROW; i++)//先释放为每一行元素开辟的空间
{
free(p_array2d[i]);
p_array2d[i] = NULL;
}
free(p_array2d);//释放为保存行首元素地址开辟的空间
p_array2d = NULL;
最后我们将程序的功能模块化,不同的功能封装到函数中:
#include <stdio.h>
#include <malloc.h>
#include <assert.h> #define ROW 3
#define COLUME 4
typedef int Type; Type **_InitArray2d(int row, int colume)
{
Type **p_array2d = NULL;
p_array2d = (Type **)malloc(sizeof(Type *) * row);
assert(p_array2d != NULL);
for (int i = ; i < row; i++)
{
p_array2d[i] = (Type *)malloc(sizeof(Type) * colume);
assert(p_array2d[i] != NULL);
} return p_array2d;
} void _AssignArray2d(Type **p_array2d, int row, int colume)
{
for (int i = ; i < row; i++)
{
for (int j = ; j < colume; j++)
{
p_array2d[i][j] = i + j;
}
}
} void _PrintArray2d(Type **p_array2d, int row, int colume)
{
for (int i = ; i < row; i++)
{
for (int j = ; j < colume; j++)
{
printf("%d ", p_array2d[i][j]);
}
printf("\n");
}
} void _DestroyArray2d(Type **p_array2d, int row)
{
for (int i = ; i < row; i++)
{
free(p_array2d[i]);
p_array2d[i] = NULL;
}
free(p_array2d);
p_array2d = NULL;
} void main()
{
Type **p_array2d = NULL; p_array2d = _InitArray2d(ROW, COLUME);
_AssignArray2d(p_array2d, ROW, COLUME);
_PrintArray2d(p_array2d, ROW, COLUME);
_DestroyArray2d(p_array2d, ROW);
}
C Program进阶-二维数组动态内存开辟的更多相关文章
- C++二维数组动态内存分配
对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体 ...
- c指针与数组,传参问题,指针数组与数组指针的区别,二维数组动态内存分配
一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的 ...
- C++二维数组动态申请内存
好久没用C++刷题了,今天早上刷了几条题,感觉很陌生了.怪我,大二下实在太颓废了,没啥作为. 今天更新个关于c++二维数组内存申请的问题,当初作为菜鸟初学指针的时候,还是在这方面有点搞不通的.今天用到 ...
- C/C++动态二维数组的内存分配和释放
C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...
- C++基础:二维数组动态的申请内存和释放内存
使用二维数组的时候,有时候事先并不知道数组的大小,因此就需要动态的申请内存.常见的申请内存的方法有两种:malloc/free 和 new/delete. 一.malloc/free (1)申请一维数 ...
- C Program基础-二维数组
一维数组可以看作一行连续的数据,只有一个下标.C语言允许构造二维数组甚至多维数组,在实际问题中有时候常常需要用到二维数组(例如数学上的矩阵),二维数组有两个下标,以确定某个元素在数组中的位置. (一) ...
- C/C++二维数组分配内存
//C++方式 double **Q=new double*[row]; //初始化Q矩阵 for(int i=0;i<row;++i) Q[i]=new double[POS_NUM]( ...
- JavaScript中给二维数组动态添加元素的质朴方法
var myData = new Array(); for(var i=0;i<tableDatas.length;i++){ var arr=tableDatas[i]; ...... /// ...
- 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
随机推荐
- (Oracle)自定义调用AWR
Oracle->自动发送AWR报告 2016年9月21日 09:31 需求描述: 每日或定期手动使用AWR报告来检查Oracle数据库状态不仅耗时也费力,需求使用脚本自动收集AWR报告. 分 ...
- Redis学习笔记(一)
定义 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库. 从该定义中抽出几个关键信息,以表示Redis的特性: 存储结构:key-val ...
- Java学习笔记二十二:Java的方法重写
Java的方法重写 一:什么是方法的重写: 如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则 返回值类型.方法名.参数类型及个数都要与父类继承的 ...
- JZ2440开发板:UART(串口)使用(学习笔记)
查看UART在硬件上的信息,阅读JZ2440原理图可以看到: JZ2440开发板的UART0是可以跟USB相接的,用于打印调试,UART1,UART2两个串口用来外接模块.所以本文仅对UART0进行操 ...
- 创建IDataProvider实例
using System; namespace Demo.Data{ public class DatabaseProvider { private static IDataProvider _ins ...
- 解决WinScp连接被拒绝的问题
尝试以下方法: 1) 开启|关闭防火墙(这里需要关闭) sudo ufw enable|disable 2) 开启远程服务 在终端界面输入:service sshd start.结果显示:ssh:un ...
- 决策树算法之ID3与C4.5的理解与实现
github:代码实现 本文算法均使用python3实现 1. 决策树 决策树(decision tree)是一种基本的分类与回归方法(本文主要是描述分类方法),是基于树结构进行决策的,可以将其认 ...
- 【转载】COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM
原文:COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM 原文:http://www.codeproject.com/Articles/633/Introduction-to-CO ...
- [并发并行]_[线程模型]_[Pthread线程使用模型之一管道Pipeline]
场景 1.经常在Windows, MacOSX 开发C多线程程序的时候, 经常需要和线程打交道, 如果开发人员的数量不多时, 同时掌握Win32和pthread线程 并不是容易的事情, 而且使用Win ...
- 学习Drupal一个容易被忽视的问题
刚刚修复了一个问题,一个非常小的问题,但我花了2-3小时才查明原因并修复. 总结下来我忽视了一个非常常见的问题或者没有养成一个好的习惯. 问题现象是:论坛发帖,只有editor以上权限的人可以发帖,也 ...