最近做算法题时,老是碰见二维指针的情况,以前老是用静态申请,感觉不灵活,于是网上查了查动态申请多维数组空间的方法,简单总结如下,希望能对跟多的人有帮助。若有人有更多的想法,可以评论添加。
数组动态空间的申请原则:
申请的时候从外层往里层,逐层申请;
释放的时候从里层往外层,逐层释放。
动态申请空间函数为:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t nelem, size_t elsize);
都在stdlib.h函数库内
realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度
例如:
char* p;
p=(char*)malloc(sizeof(char)*20);
p=(char*)realloc(p,sizeof(char)*40);
malloc与calloc的区别为1块与n块的区别:
malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。
calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域, 每一位都初始化为零,返回首地址。
realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。
其实malloc也可实现calloc分配n块存储空间空间的功能:
int *p = (int *)calloc(10,sizeof(int));
int *p = (int *)malloc(sizeof(int)*10);
以上都是申请了10个长度为sizeof(int)字节的存储空间
动态内存分配方式详见:http://general-lee.blog.sohu.com/159051330.html
以下是两个简单的示例:
一组使用malloc方法,简单需要存放30个int 数据的内存3*10:
不用
每次用for循环去分配内存。可以一次性申请所需要的内存:
int **power;
int
*subpower;
int
i,j;
power = (
int
**)
malloc
(
sizeof
(
int
) *3);
subpower = (
int
*)
malloc
(
sizeof
(
int
) * 10 * 3);
for
(i =0; i< 3;i++)
{
power[i] = &subpower[i * 10];
}
//...
free
(subpower);
free
(power);
方法2:
int
**power;
int
i
,
j;
power
=
(int
*
*
)
malloc
(
sizeof
(int
)
*
3
)
;
for
(
i
=
0
; i
<
3
;i
+
+
)
{
power[i]
=
(int
*
)
malloc
(
sizeof
(
int
)
*
10
)
;
}
/
/
....
for
(
i
=
0
;i
<
3
;i
+
+
)
{
free
(
power[i]
)
;
}
free
(
power
)
;