**动态数组起源:**
在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这四个函数。对于用malloc分配的内存区间,如果原来没有被使用过,则其中的每一位可能都是0;反之, 如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。但调用calloc()函数分配到的空间在分配时就已经被初始化为0了。
**申请原则:**
申请的时候从外层往里层,逐层申请;释放的时候从里层往外层,逐层释放。
1. 一维数组分配与释放:
* 分配:
函数原型:char *p = (char *)malloc(m*sizeof(char)); //申请m个int大小空间的p数组
//一维数组组名可以看成数组起始元素的首地址,p表示申请数组的首地址,表示申请char类型,m个char类型大小的空间
* 释放:
free(p);
2.二维数组分配与释放:
(1)使用二级指针:
char **p = (char *)malloc(m*sizeof(char *)); for(i=0;i<m;i++) { p[i]=(char *)malloc(n*sizeof(char *)); }
示例代码: #include <stdio.h> #include <stdlib.h> int main(void) { int i, row, column, **arr; while (scanf("%d %d", &row, &column) != EOF) { arr = (int **)malloc(sizeof(int *) * row); // 分配所有行的首地址 for (i = 0; i < row; i ++) { // 按行分配每一列 arr[i] = (int *)malloc(sizeof(int) * column); } // 释放开辟的二维数组空间 for (int i = 0; i < row; ++i) { free(*(arr + i)); } } return 0; }
(2)使用数组指针:
char (*p)[3] = (char(*)[3])malloc(sizeof((char)*m*n);
3.三维数组的分配与释放:
分配:
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]); } }
参考:
1. http://www.runoob.com/w3cnote/c-dynamic-array.html
2. https://blog.csdn.net/xckkcxxck/article/details/60141365
3. https://blog.csdn.net/wzy_1988/article/details/9136373
原文地址:https://www.cnblogs.com/mark2018/p/9356926.html