写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误。下面贴上一些示例代码,以供参考。

如果要给二维数组(m*n)分配空间,代码可以写成下面:

char **a, i;
  • 1

// 先分配m个指针单元,注意是指针单元

// 所以每个单元的大小是sizeof(char *)

a = (char **) malloc(m * sizeof(char * ));
  • 1

// 再分配n个字符单元,

// 上面的m个指针单元指向这n个字符单元首地址

for(i = 0; i < m; i++)

a[i] = (char * )malloc(n * sizeof(char ));
  • 1
  • 2
  • 3

(注意红色部分)

释放应该是:

int i;

for(i=0;i<m;i++)

    free((void *)a[i]);

free((void *)a);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果为三维数组(m*n*p)分配空间呢,应该是:

char ***a, i, j;

a = (char ***) malloc(m * sizeof(char ** ));

for(i = 0; i < m; ++i)

    a[i] = (char **) malloc(n * sizeof(char * ));

for(i = 0; i < m; ++i)

for(j = 0; j < n; ++j)

    a[i][j] = (char * )malloc(p * sizeof(char ));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

释放代码为逆过程,具体代码为:

int i,j,;

for(i = 0; i < m; ++i)

for(j = 0; j < n; ++j)

        free((void *)a[i][j]);   

for(i = 0; i < m; ++i)

    free((void *)a[i]);

free((void *)a);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

三维以上的多维数组的分配和释放,原理与上面的一样。

C中如何为第二维长度固定的二维数组分配内存

在所写的代码中,有时需要为一个二维数组分配内存,该二维数组的第一维长度不定,而 第二维是固定(类似arr[n][3]的数组)。我们可以想到的是用双指针代替数组,当然可以;也可以直接对n赋值后,直接定义arr[n][3] (C99标准支持),但这里要说的是另一种方法。

这里以将点云数据读入二维数组为例,由于点云点数n不定,可以确定的是,点是三维点,可以用以下方式定义并分配内存:

double (*arr)[3] = malloc (n*3*sizeof(double));
  • 1

但在VC编译环境下,将会报错——无法从“void ”转换为“double ()[3]” ,此时应该在malloc函数之前进行类型转换,应该如何转换呢?怎样转换才能成double (*)[3]类型呢,可以进行如下转换:

double (*arr)[3] = (double ((*)[3]))malloc (n*3*sizeof(double));
  • 1

搞定!:)。 
转载于:http://www.cnblogs.com/chenwenbiao/archive/2011/11/04/2236679.html

二维指针的malloc内存分配(转)的更多相关文章

  1. Java学习之二维数组定义与内存分配详解

    二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的元素有多少个. 注意: ...

  2. 二维指针*(void **)的研究(uC/OS-II案例) 《转载》

    uC/OS-II内存管理函数内最难理解的部分就是二维指针,本文以图文并茂的方式对二维指针进行了详细分析与讲解.看完本文,相信对C里面指针的概念又会有进一步的认识. 一.OSMemCreate( ) 函 ...

  3. C++二维数组动态申请内存

    好久没用C++刷题了,今天早上刷了几条题,感觉很陌生了.怪我,大二下实在太颓废了,没啥作为. 今天更新个关于c++二维数组内存申请的问题,当初作为菜鸟初学指针的时候,还是在这方面有点搞不通的.今天用到 ...

  4. C++指针和动态内存分配

    指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...

  5. C++实现离散余弦变换(参数为二维指针)

    C++实现离散余弦变换(参数为二维指针) 写在前面 到目前为止已经阅读了相当一部分的网格水印等方面的论文了,但是论文的实现进度还没有更上,这个月准备挑选一些较为经典的论文,将其中的算法实现.在实现论文 ...

  6. 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换

    在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  7. C语言里的指针探析——type *name[] 在函数参数里面,是一个二维指针

    type *name[] 在函数参数里面声明和不在函数里面声明其实不一样. type *name[] 如果在函数参数里声明,则name 是一个二维指针,并不是一个指针数组,而如果不在函数参数里声明,则 ...

  8. 通过数组初始化链表的两种方法:指向指针的引用node *&tail和指向指针的指针(二维指针)node **tail

    面试高频题:单链表的逆置操作/链表逆序相关文章 点击打开 void init_node(node *tail,char *init_array) 这样声明函数是不正确的,函数的原意是通过数组初始化链表 ...

  9. malloc内存分配与free内存释放的原理

    malloc内存分配与free内存释放的原理 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入理解计算机系统的书,原来上面有讲malloc的原理 ...

随机推荐

  1. 3--Selenium环境准备--Eclipse 引入 selenium-server包

    1.下载selenium-server包   selenium-server-standalone包是Seleniumd的核心jar包,其中包含了各种元素定位和调用浏览器的方法.下载jar包后,在ID ...

  2. 008-React-Native-Android-打包,修改名称图标(转载)

    一: 前言 React-native是目前最火的一种APP混合开发语言.本文旨在帮助一些不熟悉安卓原生开发的程序员快速熟悉安卓目录结构.使用工具:js--VS Code; 二: 目录结构 --1:新建 ...

  3. webgl,threejs教程、笔记

    发现一个不错的博客,学学. webgl和threejs教程

  4. linux 如何使用密钥登录 (CentOs)

    说明:一般的密码方式登录容易被密码暴力破解.所以一般我们会将 SSH 的端口设置为默认22以外的端口,或者禁用root账户登录.其实可以通过密钥登录这种方式来更好地保证安全. 密钥形式登录的原理是:利 ...

  5. 11.2.0.4rac service_name参数修改

    环境介绍 )客户环境11. 两节点 rac,集群重启后,集群资源一切正常,应用cs架构,连接数据库报错,提示连接对象不存在 )分析报错原因,连接数据库方式:ip:Port/service_name方式 ...

  6. [LeetCode&Python] Problem 896. Monotonic Array

    An array is monotonic if it is either monotone increasing or monotone decreasing. An array A is mono ...

  7. 在Maven项目中,指定使用阿里云仓库下载jar包

    Maven项目中,在pom.xml的</project>标签之前加入一下标签,指定使用阿里云仓库下载jar包. <!-- 使用aliyun maven --> <repo ...

  8. SFM(structure from motion)学习记录(一)

    visualSFM用法 添加图片 "File->Open Multi Images". 一次添加多幅图片 "SfM->Load NView Match&quo ...

  9. s21day02 python笔记

    s21day02 python笔记 一.昨日内容回顾及补充 内容回顾 补充 if条件语句嵌套 10086示例 pycharm更改解释器 python3.7解释器 python2.7解释器 二.循环语句 ...

  10. HDU 2206

    Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU ...