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

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=new int *[rows];     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=new int[cols];         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         delete[] p[i];     }     delete[] 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-1
content: #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-2
content: 楼主，代码中Input和Output传参a指针的时候使用的是地址传参，传过去的是已经申请过的地址，重新申请的话我没试过，你发的现象显示重新申请会把原来的空间代替，至于原来的空间就不清楚是释放了还是怎么样。还有一个小问题就是释放空间之前要把指针指向空，不然有可能会出错。我很好奇原来的空间是不是还在那里没有释放掉，希望有人能满足我的好奇心

user: user-3
content: 楼主，你第一份代码，main入口函数那边已经创建了二维数组，直接传给Input和Output函数使用就可以了，不需要重新在Input和Output函数中重新创建二维数组了。如果在Input和Output函数中重新创建，那么后者会把之前的创建的都替换掉了，这样你在Input输入的值，在Output函数中又是另外的二维数组，不是Input函数中的二维数组了，所以输出值就不对了。 第一份代码可以改为如下，可供参考： #include<stdio.h> #include<stdlib.h> int **Input(int **a, int m, int n)   //输入函数 { 	int i, j; 	printf("请输入数组：\n"); 	for (i = 0; i<m; i++) 	for (j = 0; j<n; j++) 		scanf("%d", &a[i][j]); 	return a;  }  void Output(int **a, int m, int n) { 	int i, j; 	for (i = 0; i<m; i++) 	for (j = 0; j<n; j++) 		printf("%d", a[i][j]); }  void main() { 	int **a, i, m = 0, n = 0; 	printf("请输入行和列：\n"); 	scanf("%d%d", &m, &n);  	a = (int **)malloc(sizeof(int*) * m); 	for (i = 0; i < m; i++) 		a[i] = (int*)malloc(sizeof(int)*n);  	a = Input(a, m, n); 	Output(a, m, n);  	for (i = 0; i < m; i++) 		free(a[i]);  	free(a); 	return ; }

user: user-4
content: 其实我不懂得是，你主函数已经为a申请过内存了，为啥input和output函数又要申请呢？