在Robert Sedgewick所著的Algorithm In C中,把二维数组当成数组的数组为它动态分配内存。
<wbr><wbr><wbr><span></span>首先,分配一个指针的数组,然后为每一行分配内存。<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif">
函数定义:<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><span></span>void **malloc2d(int r, int c, int size)<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><span></span>{<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span></span>int i;<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span></span>int **t = malloc(r * sizeof(void*));<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span></span>for(i=0; i<r; i++)<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span></span>t[i] = malloc(c * size);<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span></span>return t;<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><span></span>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><span></span>void free2d(void **arr, int r)<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><span></span>{<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span></span>int i = 0;<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span></span>for(i=0; i<r; i++)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span></span>free(arr[i]);<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span></span>free(arr);<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><span></span>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><span></span>这种方法好处是可以用a[i][j]的方式来访问数组元素,但是它需要分配额外内存来存储行指针。</wbr></wbr></wbr>
<wbr><wbr><wbr><span></span>另外,这种方法分配的内存是不连续的,而且在分配和释放二维数组时,要多次调用malloc和free操作,增加了系统开销。而使用以下两种方法为二维数组分配的内存是连续的,可以避免因频繁分配和释放内存而带来的内存开销。</wbr></wbr></wbr>
方法一:
<wbr><wbr><wbr><span></span>用一维数组来实现二维数组的功能,在内存中二维数组还是线性排列的。对于想申请a[m][n]数组可以如下实现:<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><span></span>int<wbr><wbr><span></span>*ptr_array;<span style="color:#008000"><br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"></span><wbr><wbr><wbr><span></span>ptr_array<wbr><wbr><span></span>=<wbr><wbr><span></span>(int*) malloc(m*n*sizeof(int));<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif">
当需要访问a[i][j]时,<wbr><wbr><span></span>用如下方式访问:<wbr><wbr><br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><span></span>*(ptr_array<wbr><wbr><span></span>+<wbr><wbr><span></span>i<wbr><wbr><span></span>*<wbr><wbr><span></span>n<wbr><wbr><span></span>+<wbr><wbr><span></span>j);<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif">
当需要释放空间时,用如下方式访问:<br style="line-height:1.5; font-family:宋体,Verdana,Arial,Helvetica,sans-serif"><wbr><wbr><wbr><span></span>free ptr_array;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><span></span>这种方式实际上是把二维数组用一维数组表示,<wbr><span></span>再模拟成二维数组使用.</wbr></wbr></wbr></wbr>
方法二:
void **malloc2d(int row,int col,int size)
{
void **a,*b;
a=(void**)malloc(row*sizeof(void*));
b=(void*)malloc(row*col*size);
if(a!=NULL&&b!=NULL)
while(row--)
a[row]=&b[row*col*size];
return a;
}
void free2d(void **a,void *b)
{
if(a!=NULL&&b!=NULL)
{
free(a);
free(b);
}
}
<wbr><wbr><wbr><span></span>这种方法的好处和不足之处同Robert Sedgewick的方法一样,可以用a[i][j]的方式来访问,但仍然需要额外分配内存来存储行指针。但它分配的空间是连续的,可以避免因频繁分配和释放内存而带来的内存开销,这一点又可与方法一媲美。</wbr></wbr></wbr>
最值得推荐的方法是方法二。
分享到:
相关推荐
指针是c和c++的精华,也是永远的痛,利用指针进行二维数组动态分配
本程序实现了一维,二维和三维数组的动态分配空间 以及在析构函数中将空间全部回收的过程。
C语言动态分配二维数组,对数组动态分配进行详细描述
内容:C和C++中关于二维数组的动态申请和释放的一些描述和示例。
C++中二维数组的动态分配
C语言 实在 矩阵的乘法 加法 转置 各个子涵数都有通用性,内存的分配是使用二维数组动态 malloc 分配
C++中动态分配一维数组是十分常见的事,但会分配一维数组的人并不一定会分配二维数组。因为我想,不到特殊情况,我们可能很少想过要使用动态分配的二维数组。但不管怎么样,只要你是第一次想试着去分配一个二维数组...
使用C的二级指针动态分配二维数组,在linux和vs2010下均编译通过。
C++动态为二维数组分配空间的问题 含程序和方法
Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因 为每一片区域都有特定的处理数据方式和内存管理方式。 栈内存 用于存储局部变量,当数据使用完,所占空间会...
在C++中,可以使用vector来创建二维数组。vector是C++标准库中的一个动态数组容器,可以自动管理内存的分配和释放。使用vector创建二维数组时,需要先创建一个外层的vector,然后为每个元素再创建一个内层的vector。...
二维数组指针分配 形式有多种 可以指定一维 分配一维 也可以不指定都分配
C语言中动态分配二维数组.doc
用C++实现使用链表动态分配二维数组 用C++实现使用链表动态分配二维数组
C语言中的二维数组初始化可以通过以下几种方式实现: 使用花括号进行初始化:在定义二维数组时,直接使用花括号将每...使用动态内存分配进行初始化:首先为二维数组的每一行分配内存,然后再为每一行的每个元素分配内存
附录:Java的内存分配ava的内存分配附录:Java的内存分配
该项目利用c语言的malloc函数实现了一维和二维动态数组的创建,并且二维数组采用了两种方式。该项目对了解程序的内存分配具有很好的益处。
对一个二维数组进行Zig-Zag方式扫描,其中二维数组是动态分配空间和赋值的。包含一个自己实现的类,可以直接供外部程序调用。
第一种方式是直接传递二维数组,但是必须标明第二维的值,因为如果只是传递a[][],编译器无法分配这样的数组,所以要这样传int a[][3] 第二种方法是传递指针数组方式,即int (*a)[3] 第三种是传递指针方法。 具体...
实验三存储器的分配及回收算法实现二维数组.doc