二维数组与堆的二维空间的异同
堆上的二维空间,并不一定就是二维数组,只是具有数组的访问形式,但是其已经远远不是数组的定义了
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #if 1 5 /*在堆上创建一个内存分布与二维数组相同的二维空间,一级指针作为返回值*/ 6 7 void* alloc2dSpace(int base,int row,int line) 8 { 9 void *p = malloc(base*row*line); 10 return p; 11 } 12 13 int main(void) 14 { 15 /*创建一个3*5*int的二维空间*/ 16 int (*p)[5] = alloc2dSpace(sizeof(int),3,5); 17 18 /*使用方式与对二维数组的访问方式完全相同*/ 19 //初始化 20 int i,j; 21 for(i = 0;i<3;i++) 22 { 23 for(j = 0;j<5;j++) 24 { 25 // *(*(p+i)+j) = i+j; 26 p[i][j] = i+j; 27 } 28 } 29 //打印 30 for(i = 0;i<3;i++) 31 { 32 for(j = 0;j<5;j++) 33 { 34 //printf("%d",*(*(p+i)+j) ); 35 printf("%d",p[i][j] ); 36 } 37 putchar(10); 38 } 39 /*释放*/ 40 free(p);p = NULL; 41 42 43 return 0; 44 } 45 #endif
1 #include <stdio.h> 2 #include <stdlib.h> 3 #if 1 4 /*在堆上创建一个内存分布与二维数组不同与指针数组相同的二维空间,二级指针作为返回值,但在表面使用上却与二维数组访问方式相同,*/ 5 void** alloc2dSpace(int base,int row,int line) 6 { 7 void ** p = (void**)malloc(sizeof(int*)*row); 8 int i; 9 for(i = 0;i< row;i++) 10 { 11 p[i] = malloc(base*line); 12 } 13 return p; 14 15 } 16 17 int main(void) 18 { 19 int **p = alloc2dSpace(sizeof(int),3,5); 20 21 /*使用方式与对二维数组的访问方式完全相同*/ 22 //初始化 23 int i,j; 24 for(i = 0;i<3;i++) 25 { 26 for(j = 0;j<5;j++) 27 { 28 // *(*(p+i)+j) = i+j; 29 p[i][j] = i+j; 30 } 31 } 32 //打印 33 for(i = 0;i<3;i++) 34 { 35 for(j = 0;j<5;j++) 36 { 37 //printf("%d",*(*(p+i)+j) ); 38 printf("%d",p[i][j] ); 39 } 40 putchar(10); 41 } 42 43 /*释放,由内而外释放*/ 44 for(i = 0;i<3;i++) 45 { 46 free(*p+i); 47 //free(p[i]); 48 } 49 free(p); 50 51 return 0; 52 }