一、C语言中不定大小多维数组的处理:

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

char **a, i;

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

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

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

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

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

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

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

释放应该是:

int i;

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

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

free((void *)a);

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

char ***a, i, j;

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

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

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

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

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

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

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

int i,j,;

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

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

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

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

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

free((void *)a);

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

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

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

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

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

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

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

搞定!:)。

三、C++之new    delete

1.普通类型(结构体、类等都一样):

int* a;

a=new int;

*a=3;

delete a;

2.数组:

int* a;

a=new int[num];

delete []a;

 

malloc、free、new、delete的更多相关文章

  1. 类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete

    一.类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名();  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  2. (转) Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化

    硬盘空间不足,打算删除数据库中的多余数据,但删除数据后,硬盘硬盘空间不能释放.[delete后用:alter table table_name move    truncate后用:alter tab ...

  3. 转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

    内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放 ...

  4. 1、链表之增、删、查实现(C语言)

    一.功能描述: 可以创建节点并添加到链表中.查看链表中的所有节点.并可以删除特定的节点 二.代码实现 1.主函数main主要实现的是从后台键入不同的字符,执行对应的函数来实现特定的操作代码如下: in ...

  5. C++内存分区:堆、栈、自由存储区、全局/静态存储区和常量存储区

    日志                                                                                                  ...

  6. 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

    http://www.cnblogs.com/JCSU/articles/1051579.html 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序 ...

  7. 范围for、new内存动态分配、nullptr

    一.范围for语句:用于遍历一个序列 ,,,,}; for(auto &x : v) // 省了拷贝的动作,提高了系统效率 { cout << x << endl; } ...

  8. c++ 堆、栈、自由存储区、全局/静态存储区和常量存储区

    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数 ...

  9. linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区

    栈,就是那些由编译器在须要的时候分配,在不须要的时候自己主动清除的变量的存储区.里面的变量一般是局部变量.函数參数等.在一个进程中.位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆 ...

  10. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

随机推荐

  1. Python 编程规范梳理

    缘由 由于项目团队中新加入了几名攻城狮, 大家之前的背景各不相同,写出的代码也是“风格迥异”.正所谓:“无规则不成方圆”,因此需要对编程进行必要的规范. 整体的思路是:依照PEP8 Python 编码 ...

  2. javascript的面向对象思想知识要点

    获取数据类型 typeof undefined:访问某个不存在的或未经赋值的变量时就会得到一个 undefined,用typeof 获取类型,得到的也是undefined;null:它不能通过java ...

  3. 第13章 TCP编程(2)_TCP的连接和关闭过程

    4. TCP的连接和关闭过程 4.1 TCP连接的三次握手和四次挥手 (1)三次握手 ①第1次握手:建立连接.客户端发送连接请求报文段(SYN=1,sequence Number=x):然后客户端进入 ...

  4. MySQL数据库InnoDB存储引擎

    MySQL数据库InnoDB存储引擎Log漫游  http://blog.163.com/zihuan_xuan/blog/static/1287942432012366293667/

  5. css 元素选择器实例

    一个完整的HTML页面是有很多不同的标签组成,而标签选择器,则是决定哪些标签采用相应的CSS样式.本文章向码农介绍css 标签/元素选择器以及其实例,需要的码农可以参考一下. [标签选择器] 一个完整 ...

  6. 无法打开物理文件 XXX.mdf"。操作系统错误 5:"5(拒绝访问。)"的解决办法

    附加数据库时报错: 无法打开物理文件 XXX.mdf".操作系统错误 5:"5(拒绝访问.)" 原因是数据库权限无法读取路径下的文件. 解决方案 一: 数据库使用wind ...

  7. 代码生成器 CodeSmith 的使用(六)

    在上一篇的版本中,我们生成了数据库所有表中的字段,如果要使数据库中的单个表 生成 PetaPoco 构架下的 ORM 映射,使那怎么办.这是这篇博客的主要内容. 首先来看完整的 Camel 规则模板: ...

  8. Python之函数——内置函数

    内置函数(Built-in Functions) 截止到3.6版本,python一共为我们提供了68个内置函数.它们就是python提供给的可以直接拿来使用的所有函数,接下来让我们一起认识一下这些函数 ...

  9. 使用eclipse从github导入maven项目

    github给的地址是类似https://github.com/xxx/se.git格式; 如何将其用eclipse导入呐? 第一步, Import Projects from Git 导入成功后 第 ...

  10. 转载:canal数据库同步redis

    ref: http://blog.csdn.net/tb3039450/article/details/53928351