风言枫语  

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


 

 

 

posted on 2013-10-29 22:11  风言枫语  阅读(131)  评论(0编辑  收藏  举报