malloc、free、new、delete
一、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的更多相关文章
- 类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
一.类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名(); C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- (转) Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化
硬盘空间不足,打算删除数据库中的多余数据,但删除数据后,硬盘硬盘空间不能释放.[delete后用:alter table table_name move truncate后用:alter tab ...
- 转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]
内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放 ...
- 1、链表之增、删、查实现(C语言)
一.功能描述: 可以创建节点并添加到链表中.查看链表中的所有节点.并可以删除特定的节点 二.代码实现 1.主函数main主要实现的是从后台键入不同的字符,执行对应的函数来实现特定的操作代码如下: in ...
- C++内存分区:堆、栈、自由存储区、全局/静态存储区和常量存储区
日志 ...
- 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]
http://www.cnblogs.com/JCSU/articles/1051579.html 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序 ...
- 范围for、new内存动态分配、nullptr
一.范围for语句:用于遍历一个序列 ,,,,}; for(auto &x : v) // 省了拷贝的动作,提高了系统效率 { cout << x << endl; } ...
- c++ 堆、栈、自由存储区、全局/静态存储区和常量存储区
在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数 ...
- linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区
栈,就是那些由编译器在须要的时候分配,在不须要的时候自己主动清除的变量的存储区.里面的变量一般是局部变量.函数參数等.在一个进程中.位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆 ...
- JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...
随机推荐
- 《java笔记》
1.判断是否是整数,包含正数和负数 /** * 判断是否是整数包含正负 */ public static boolean isInteger(String str){ Pattern pattern ...
- java学习——构造类
package my_project; public class my_first_class { public static void main(String[] args) { // TODO A ...
- 9-16Jenkins-2定时任务
定时任务 选择定时任务,点击 "?" 会弹出使用教程,但讨厌英语的人,自然选择现成的中文. 猪脚踏浪https://www.cnblogs.com/zsg88/p/9178625. ...
- centos7 设置系统时间与网络同步
1.安装ntpdate工具 yum -y install ntp ntpdate 2.设置系统时间与网络时间同步 ntpdate cn.pool.ntp.org 3.将系统时间写入硬件时间 hwclo ...
- (转!)Netdata---Linux系统性能实时监控平台部署
我一直以为人是慢慢变老的,其实不是,人其实是一瞬间变老的. -------村上春树<舞!舞!舞!> 转自https://www.cnblogs.com/kevingrace/p/73001 ...
- (转)RRU交织冗余在LTE-R组网中的应用研究
RRU交织冗余在LTE-R组网中的应用研究 王 芳1,2 庞萌萌1,2 (1.北京全路通信信号研究设计院集团有限公司,北京 100070; 2.北京市高速铁路运行控制系统工程技术研究中心,北京 100 ...
- storm的定时任务
应用场景: 第一种方法 参考代码StormTopologyTimer1.java package yehua.storm; import java.util.Map; import org.apach ...
- X-Requested-With
最近工作中发现,使用angular $http跨域的时候,虽然后台已经配置了跨域允许,但是还是报错. 查资料发现,angular $http 的request的请求头中,默认有: Access-Con ...
- 基于Linux的Samba开源共享解决方案测试(一)
转自http://blog.csdn.net/u013394982/article/details/17914429 Linux操作系统 Linux是一类Unix计算机操作系统的统称.Linux操作系 ...
- Map 合并
比如说 qq.com 100 163.com 90 QQ.COM 10 Qq.Com 5 …… 如果统计的话,需要忽略大小写的,即 QQ邮箱总共是100+10+5,怎么写? 其实这个应该不难的,就 ...