当前位置:编程学习 > C/C++ >>

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

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++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,