从内存角度理解指针和数组(三)

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值