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


    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:
    ");
    	func1();
    	printf("
    ");
    }
    invoke func1:
    19 18 17 16 15 14 13 12


  • 相关阅读:
    如何编写CMakeLists.txt
    C++11 condition_variable
    TCP/IP 收发数据
    CLion 远程开发和调试C/C++代码
    Python unittest mock 在哪里打patch
    MVCC版本链
    数据无法修改?解密MVCC原理
    MVCC ReadView介绍
    正则表达式备忘(基于JavaScript)
    《C+编程规范 101条规则、准则与最佳实践》笔记
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3395417.html
Copyright © 2020-2023  润新知