二维数组动态分配内存

C 二维数组动态分配和释放
(1)已知第二维
Code-1
char (*a)[N];//指向数组的指针
a = (char (*)[N])malloc(sizeof(char *) * m);
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//N,一维数组
free(a);
(2)已知第一维
Code-2
char* a[M];//指针的数组
int i;
for(i=0; i<M; i++)
a[i] = (char *)malloc(sizeof(char) * n);
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<M; i++)free(a[i]);
(3)已知第一维,一次分配内存(保证内存的连续性)
Code-3
char* a[M];//指针的数组
int i;
a[0] = (char *)malloc(sizeof(char) * M * n);
for(i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
free(a[0]);
(4)两维都未知
Code-4
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指针数组
for(i=0; i<m; i++)
{
a[i] = (char *)malloc(sizeof(char) * n);//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<m; i++)
{
free(a[i]);
}
free(a);
(5)两维都未知,一次分配内存(保证内存的连续性)
Code-5
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指针数组
a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空间
for(i=1; i<m; i++)
{
a[i] = a[i-1] + n;
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
free(a[0]);
free(a);
2.C++动态分配二维数组
(1)已知第二维
Code-6
char (*a)[N];//指向数组的指针
a = new char[m][N];
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//N,一维数组
delete[] a;
(2)已知第一维
Code-7
char* a[M];//指针的数组
for(int i=0; i<M; i++)a[i] = new char[n];
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<M; i++)delete[] a[i];
(3)已知第一维,一次分配内存(保证内存的连续性)
Code-8
char* a[M];//指针的数组
a[0] = new char[M*n];
for(int i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
delete[] a[0];
(4)两维都未知
Code-9
char **a;
a = new char* [m];//分配指针数组
for(int i=0; i<m; i++)
{
a[i] = new char[n];//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<m; i++)
delete[] a[i];
delete[] a;
(5)两维都未知,一次分配内存(保证内存的连续性)
Code-10
char **a;
a = new char* [m];
a[0] = new char[m * n];//一次性分配所有空间
for(int i=1; i<m; i++)
{
a[i] = a[i-1] + n;//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
delete[] a[0];
delete[] a;
多说一句:new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!
3.静态二维数组作为函数参数传递
如果采用上述几种方法动态分配二维数组,那么将对应的数据类型作为函数参数就可以了。这里讨论静态二维数组作为函数参数传递,即按照以下的调用方式:
int a[2][3];
func(a);
C语言中将静态二维数组作为参数传递比较麻烦,一般需要指明第二维的长度,如果不给定第二维长度,则只能先将其作为一维指针传递,然后利用二维数组的线性存储特性,在函数体内转化为对指定元素的访问。
首先写好测试代码,以验证参数传递的正确性:
(1)给定第二维长度
Code-11
void func(int a[][N])
{
printf("%d\n", a[1][2]);
}
(2)不给定第二维长度
Code-12
void func(int* a)
{
printf("%d\n", a[1 * N + 2]);//计算元素位置
}
注意:使用该函数时需要将二维数组首地址强制转换为一维指针,即func((int*)a);

二维数组动态分配内存相关推荐

  1. 如何给一个二维数组动态分配内存

    今天最算法project时遇到需要使用一个动态数组,并且这个数组在编译时还是不知道大小的,到底能不能给二维数组动态分配空间,我还真没试过.是不是跟一维数组一样?用int *ar = new int[n ...

  2. C++/C--动态二维数组的内存分配与释放【转载】

    1 C语言_二维数组动态数组分配和释放 1.1 数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(cha ...

  3. c语言二维数组存储坐标,C语言的二维数组在内存中的存放顺序

    C语言的二维数组在内存中的存放顺序 发布时间:2020-06-28 18:23:49 来源:亿速云 阅读:708 作者:Leah 这期内容当中小编将会给大家带来有关C语言的二维数组在内存中的存放顺序, ...

  4. C/C++动态二维数组的内存分配和释放

    C语言: 1 //二维数组动态数组分配和释放 2 //数组指针的内存分配和释放 3 //方法一 4 char (*a)[N];//指向数组的指针 5 a = (char (*)[N])malloc(s ...

  5. 二维数组在内存空间地址不一定连续

    一维数组的地址是连续的,所以不能进行频繁的增删操作,如果有增删操作更适合用链. 二维数组地址不一定连续,极少情况下连续 int[][] m=new int[2][4]   是一个2*4的矩阵 其中m[ ...

  6. C/C++二维数组分配内存

    //C++方式 double **Q=new double*[row];    //初始化Q矩阵 for(int i=0;i<row;++i) Q[i]=new double[POS_NUM]( ...

  7. 二维指针动态分配内存连续问题分析

    当我们定义一个二维指针时,如果需要存储相应的数据,就需要我们动态的分配内存,这时,有一点是需要注意的,分配内存的方法不同,内存的连续性也是不相同的,首先,博主先贴出测试代码: #include < ...

  8. C语言中 二维数组在内存中的存放顺序是,在计算机中二维数组的元素是按行顺序存放的,即在内存中,先顺序存放二维数组第一行的元素,再顺序存放二维数组第二行的元素,以此类推 答案:对...

    相关问题 服装时尚流行趋势包含哪些元素 中国大学MOOC: 在本征半导体中掺入三价元素的杂质半导体的自由电子是( ). 下列说法正确的有( ).: 说法 逻辑 关系 上 数据 结构 类 线性 结构 结 ...

  9. 【javase基础】第八篇:二维数组的内存结构

最新文章

  1. 在Ubuntu 14.04 64bit上生成ATS本地离线文档
  2. salesforce bigobject 的限制_苹果进一步限制第三方维修
  3. 在ListBox中添加ToggleButton(有IsChecked属性)
  4. 爱因斯坦和高中几何问题
  5. sharding分表后主键_分库分表【Sharding-JDBC】入门与项目实战
  6. 盲人方便的使用计算机输入文字,中文信息学报盲人用计算机软件系统中的语音和自然语言处理技术Ξ.PDF...
  7. RedHat Linux和Cent Linux日常运维之安全加固详细篇
  8. 如何在 Pr 中创建动作序列?
  9. C++多线程编程(真实入门)
  10. 过去25年八大计算机病毒:冲击波和震荡波入选
  11. 信号与线性系统管致中第六版pdf_【对讲机的那点事】无线电天馈系统中载频合路器的作用...
  12. 计算机播放qq音乐没声音怎么办,电脑突然没声音了.开启QQ音乐说要检查音效卡驱动程式设定是否正常....
  13. 【从零开始游戏开发】EmmyLua插件注解功能
  14. vista任务管理器_为什么我的Windows Vista资源管理器发送到菜单挂起或打开缓慢?...
  15. deepfacelab安卓版_DeepFaceLab2.0中文版
  16. [个人笔记]HCIP-Routing Switching-IERS/H12-221
  17. Excel技能树系列05:TEXT函数,IF函数和INDEX+MATCH组合查找函数
  18. 使用文氏图说明贝叶斯公式如何导出、推导朴素贝叶斯算法以及实例
  19. 【Vue报错】This is probably not a problem with npm. There is likely additional logging output above
  20. 电脑右键“打开方式”不见了怎样恢复

热门文章

  1. 项目管理project甘特图模板_【八大项目管理应用】必用项目管理工具对比推荐...
  2. Java容器--Map
  3. SpringBoot+Mybatis 框架之 @Select注解方式搭建
  4. Access中出现改变字段“自己主动编号”类型,不能再改回来!(已解决)
  5. SQL Server-创建表格、各种约束条件
  6. 华为2288H V5服务器 RAID操作
  7. Android 在 SElinux下 如何获得对一个内核节点的访问权限
  8. WINCE基于PWM实现的背光驱动
  9. MySQL-事务管理(基础)
  10. python中字符串编码转换