user-0 提问: 二维动态数组

回复:
user: user-0
content: 谢谢各位了，懂了。

user: user-1
content: 庆幸7楼还记得本ID的代码。 //在堆中开辟一个3×4×5的3维int数组 #include <stdio.h> #include <malloc.h> int ***p; int i,j,k; void main() {     p=(int ***)malloc(3*sizeof(int **));     if (NULL==p) return;     for (i=0;i<3;i++) {         p[i]=(int **)malloc(4*sizeof(int *));         if (NULL==p[i]) return;         for (j=0;j<4;j++) {             p[i][j]=(int *)malloc(5*sizeof(int));             if (NULL==p[i][j]) return;         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 p[i][j][k]=i*20+j*5+k;             }         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 printf(" %2d",p[i][j][k]);             }             printf("\n");         }         printf("---------------\n");     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             free(p[i][j]);         }         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //--------------- // 20 21 22 23 24 // 25 26 27 28 29 // 30 31 32 33 34 // 35 36 37 38 39 //--------------- // 40 41 42 43 44 // 45 46 47 48 49 // 50 51 52 53 54 // 55 56 57 58 59 //---------------  //在堆中开辟一个2×3×4×5的4维int数组 #include <stdio.h> #include <malloc.h> int ****p; int h,i,j,k; void main() {     p=(int ****)malloc(2*sizeof(int ***));     if (NULL==p) return;     for (h=0;h<2;h++) {         p[h]=(int ***)malloc(3*sizeof(int **));         if (NULL==p[h]) return;         for (i=0;i<3;i++) {             p[h][i]=(int **)malloc(4*sizeof(int *));             if (NULL==p[h][i]) return;             for (j=0;j<4;j++) {                 p[h][i][j]=(int *)malloc(5*sizeof(int));                 if (NULL==p[h][i][j]) return;             }         }     }     for (h=0;h<2;h++) {         for (i=0;i<3;i++) {             for (j=0;j<4;j++) {                 for (k=0;k<5;k++) {                     p[h][i][j][k]=h*60+i*20+j*5+k;                 }             }         }     }     for (h=0;h<2;h++) {         for (i=0;i<3;i++) {             for (j=0;j<4;j++) {                 for (k=0;k<5;k++) {                     printf(" %3d",p[h][i][j][k]);                 }                 printf("\n");             }             printf("--------------------\n");         }         printf("=======================\n");     }     for (h=0;h<2;h++) {         for (i=0;i<3;i++) {             for (j=0;j<4;j++) {                 free(p[h][i][j]);             }             free(p[h][i]);         }         free(p[h]);     }     free(p); } //   0   1   2   3   4 //   5   6   7   8   9 //  10  11  12  13  14 //  15  16  17  18  19 //-------------------- //  20  21  22  23  24 //  25  26  27  28  29 //  30  31  32  33  34 //  35  36  37  38  39 //-------------------- //  40  41  42  43  44 //  45  46  47  48  49 //  50  51  52  53  54 //  55  56  57  58  59 //-------------------- //======================= //  60  61  62  63  64 //  65  66  67  68  69 //  70  71  72  73  74 //  75  76  77  78  79 //-------------------- //  80  81  82  83  84 //  85  86  87  88  89 //  90  91  92  93  94 //  95  96  97  98  99 //-------------------- // 100 101 102 103 104 // 105 106 107 108 109 // 110 111 112 113 114 // 115 116 117 118 119 //-------------------- //======================= //

user: user-2
content: p[0]=(int *)malloc(sizeof(int)*row*column); ==>  for (int i = 0 ;  i < row ; i++)     p[i] = (int *)malloc(sizeof(int) * column) ;   p[0]只为第一个元素申请了内存

user: user-3
content: 楼上好像说错了  **p 和 p[i][j] 应该是不一样的东西   其实并没有什么二维数组，都只是多维到一维的映射（编译器知道   我们却不知道）  你的代码也有错误   p[0] 有malloc   p[1] 却没有    下面是 zhao4laoshi 的代码   希望对你有帮助   #include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;       p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;       for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;       r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);       r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);       return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-0
content: #include<stdio.h> #include<stdlib.h> int main() { 	int row,column; 	while(scanf("%d%d",&row,&column)!=EOF) 	{ 		int **p,i,j; 		p=(int **)malloc(sizeof(int *)*row); 		p[0]=(int *)malloc(sizeof(int)*row*column); 		for(i=0;i<row;i++) 		{ 			for(j=0;j<column;j++) 			{ 				scanf("%d",&p[i][j]); 			} 		} 		for(i=0;i<column;i++) 		{ 			for(j=0;j<row;j++) 			{ 				if(j==(row-1)) 					printf("%d\n",p[j][i]); 				else 					printf("%d ",p[j][i]); 			} 		} 		free(p[0]); 		free(p); 	} 	return 0; } 这个是我写的，可是过不了，帮忙看一下，谢了。

user: user-0
content: 我也是这样写的可是编译器没有过，执行不了。。

user: user-4
content: 你知道他是二维数组，还不会用？简单点，你会不会用二维数组？

user: user-5

user: user-0
content: 回一下  7  楼，**p 和 p[i][j],,的意思是一样的，都表示我们认为中的二维数组

user: user-0
content: 给出代码的几位朋友，如果写成： p=(int **)malloc(sizeof(int *)*row); p[0]=(int *)malloc(sizeof(int)*row*column)； 然后在输入数据时 for(i=0;i<row;i++) { for(j=0;j<column;j++)       scanf("%d",p[i]++); } 可以不？ 因为一维动态数组使用的时候：： p=(int *)malloc(sizeof(int)*n); for(i=0;i<n;i++) {      scanf("%d",p++); } 所以想二维是不是也可以这样用。

user: user-2
content: for (int i = 0 ; i < row ; i++)     for (int j = 0 ; j < column; j++)            scanf("%d", &p[i][j]);

user: user-2
content: for (int i = 0 ; i < row ; i++)     for (int j = 0 ; j < column; j++)            scanf("%d", &p[i][j]);

user: user-6
content: p[i][j]啊，就这样就行