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二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
随机推荐
- windows下3D文字
windows下3D文字 简单概述 需要在每一帧的视频图像上面添加3D文字,文字可以自由移动位置,变换各种字体属性,还能进行一些简单动画.然后把处理好的视频图像传个下一个步骤去处理.做的过程中参考了G ...
- React最佳实践(1)
React最佳实践不敢妄谈,但最差实践非知乎莫属. 旧版知乎看起来土了点,但体验流畅,起码用起来舒服. 新版知乎看起来UI现代化,技术实现上采用了React,但是可能因为知乎缺钱,请不起高水平的前端工 ...
- HDU 2065 "红色病毒"问题(生成函数)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- hdu_4465_Candy
LazyChild is a lazy child who likes candy very much. Despite being very young, he has two large cand ...
- docker build
nginx Docfile ----------------------- FROM centos MAINTAINER daniel RUN yum install -y wget RUN ...
- ;(function($,window,document,undefined){})(jQuery,window,document)
;(function($,window,document,undefined){})(jQuery,window,doucment) 1.自调函数(function(){})() 2.好处是不会产生任 ...
- [Java]Java 9运行Spring Boot项目报错的解决办法
简介 为了学习和尽快掌握 Java 9 的模块化(Module System)新特性,最近安装了 JDK 9,新建了一个 Spring Boot 进行尝试, 过程中遇到了一下报错问题,写下此文谨作为个 ...
- Oracle_11g桌面版 中解决被锁定的scott 教学数据库的方法
Oracle 11g中修改被锁定的用户:scott 在安装完Oracle10g和创建完oracle数据库之后,想用数据库自带的用户scott登录,看看连接是否成功. 在cmd命令中,用“sqlplus ...
- Hadoop入门学习路线
走上大数据的自学之路....,Hadoop是走上大数据开发学习之路的第一个门槛. Hadoop,是Apache的一个开源项目,开发人员可以在不了解分布式底层细节,开发分布式程序,充分利用集群进行高速运 ...
- Java线程状态图
嘤,先盗图一张,后面再补充描述!