动态分配二维数组
来源:互联网 发布:rds mysql 慢 编辑:程序博客网 时间:2024/06/04 18:17
文章转自
http://hi.baidu.com/jiaon/item/52017c5a145debcfd2e10c52
动态分配空间连续的二维数组:
最近做的一个东西需要动态分配大空间的二维数组,然后进行整块内存(缓冲区 buffer)的操作,出现了二维数组空间不连续的问题。
动态分配二维数组的一般方法是这样:假设数组存的数据类型是int
int **p=NULL;
p=new int*[nWidth];
if (!p){
return NULL;
}
for (int j=0;j<nWidth;j++){
p[j]=new int[nHeight];
if (!p[j]){
return NULL;
}
}
这段代码浅显易懂,先分配第1维,在循环分配第2维。假设二维数组是3×2的,每一句运行完后的内存情况如图所示(方格表示内存,xx表示随机数。下面是内存地址。当然,这个地址是个示意,事实不会分配到那的。):
第一句完后分配了3个内存单元
循环分配后,注意下面3段内存是不连续的。这样用下表p[n][m]操作数组没问题,如果整块内存操作就会有问题了,比如下面这句:
原意是想把下面的3块6个内存单元清0,可是事与愿违,把从p开始后面6个内存单元清0了,p[]不能用了。p后面只有3个已分配的内存单元,却要操作6个,另外3个是未知区域。清了后面虚线的3块未知区域,这就很危险了,可能导致程序崩溃。
这样分配的内存需要循环释放。
对这个方法有一改进,如下:
int **p=NULL;
p=new int *[nWidth];
if (!p){
return NULL;
}
p[0]=new int[nWidth*nHeight];
if (!p[0]){
delete[] p;
return NULL;
}
ZeroMemory(p[0],nWidth*nHeight*sizeof(int));
for (int i=1;i<nWidth;i++){
p[i]=p[i-1]+nHeight;
}
这段代码解决了分配的空间不连续的问题。每一句运行完后的内存情况如图所示:
第一句和上面一样。
这6个内存单元是一次分配的,所以连续。
这个二维数组的数据首地址是p[0],p是第2维的索引首地址。所以如果要对二维数组进行整体的内存(缓冲区 buffer)操作,要以p[0]为操作对象的首地址。
到此,索引与对应的数据地址关联上了。这个二维数组既可以通过下表p[][]来操作,又可以操作缓冲区。操作缓冲区的函数比如memcpy,cfile的writehuge和readhuge使用起来很方便,省去了2次循环的麻烦。
至于释放,不必循环释放。因为new了2次,所以只需delete2次就行了:
if(!p){
return;
}
delete []p[0];
p[0]=NULL;
delete[] p;
p=NULL;
- 动态分配二维数组
- 动态分配二维数组
- 如何动态分配二维数组
- 动态分配二维数组
- 动态分配二维数组
- 动态分配二维数组
- 二维数组动态分配
- 动态分配二维数组
- 动态分配二维数组
- 动态分配二维数组
- 动态分配二维数组
- 二维数组动态分配内存
- 二维数组的动态分配
- 二维数组动态分配
- 动态分配二维数组
- 动态分配二维数组
- C++动态分配二维数组
- 二维数组动态分配内存
- .aspx页面在低版本ie下文档模式自动为“杂项(Quirks)”导致页面变样的问题
- 指针函数和函数指针
- VMware内存分配初探
- Sicily 11600. Pick It
- java读取 *.properties文件
- 动态分配二维数组
- css3中webkit-box的用法
- C++STL 常用 函数 用法
- 计算机中的数学
- Next Permutation
- servlet/filter/listener/interceptor区别与联系
- Libgdx TexturePacker大图分割为小图
- 初识struts2和hibernate在MyEclipse下整合
- MySQL监控工具之orzdba