c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区。可以根据需要,向系统申请所取空间的大小,因为没有在声明部分定义它们为变量或数组,所以不能通过变量名或数组的方式去引用这些数据,只能通过指针来引用。
对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这四个函数。
接下来写一下malloc函数如何实现为一维,二维,三维数组分配空间。
一;一维数组的申请与释放:
例如为一个字符数组分配空间:
char *p = (char *)malloc(m*sizeof(char));
释放空间:
free(p);
二:二维数组的申请与释放:
1:使用二级指针:
char **p = (char *)malloc(m*sizeof(char *)); for(i=0;i<m;i++) { p[i]=(char *)malloc(n*sizeof(char *)); } //释放空间: for(i-0;i<m;i++) { free(p[i]); } free(p);
2:使用数组指针的方式:
char (*p)[3] = (char(*)[3])malloc(sizeof((char)*m*n);
这种方式分配的内存只需要释放一次:
free(p);
三:三维数组的申请与释放:
char ***p=(char* **)malloc(m*sizeof(char**)); for(i=0;i<m:i++) p[i]=(char **)malloc(n*sizeof(char*)); for(i=0;i<m;i++) for(j=0;j<n;j++) p[i][j]=(char *)malloc(p*sizeof(char)); //释放空间: for(i=0;i<m;i++) for(j=0;j<n;j++) free(p[i][j]); for(i=0;i<m:i++) free(p[i]); free(p);
注意:可以看出分配空间与释放空间都是逐步进行的,但是释放空间的顺序与分配空间的顺序相反。