从内存角度理解指针和数组(三)
1,不连续存储的数组——易做图动态数组与前面所说的内建数组(编译阶段需确定空间,并连续开辟内存)不同,易做图动态数组可以在程序运行时再从堆内存中申请空间。以三维动态数组为例,使用易做图动态数组首先是定义一个多级指针,然后按照段、页、行的方式一层层地申请堆内存。虽然它们的行间、页间、段间并不是连续的(页内是连续的),却可以使用多级指针变量和中括号[]的方式来索引。值得注意的是:释放内存空间的次序刚好与申请的次序相反,按照行、页、段的次序。
#include<stdio.h> #include<stdlib.h> #include<memory.h> void func1(void){ int i,j,z; int ***p; p = calloc(2,sizeof(int **)); p[0] = calloc(2, sizeof(int *)); p[1] = calloc(2, sizeof(int *)); p[0][0] = calloc(2,sizeof(int)); p[0][1] = calloc(2,sizeof(int)); p[1][0] = calloc(2,sizeof(int)); p[1][1] = calloc(2,sizeof(int)); p[0][0][0] = 19; p[0][0][1] = 18; p[0][1][0] = 17; p[0][1][1] = 16; p[1][0][0] = 15; p[1][0][1] = 14; p[1][1][0] = 13; p[1][1][1] = 12; for(i=0;i<2;i++) for(j=0;j<2;j++) for(z=0;z<2;z++) printf("%d ",p[i][j][z]); for(i=0;i<2;i++) for(j=0;j<2;j++) free(p[i][j]); free(p[0]); free(p[1]); free(p); } int main(void){ printf("invoke func1:\n"); func1(); printf("\n"); }
invoke func1: 19 18 17 16 15 14 13 12
补充:软件开发 , C++ ,