user-0 提问: 指针动态分配二维数组内容无故发生变化？

回复:
user: user-1
content: 测试过了，原来出错是因为ABCD没有赋值，改正后结果正确。用的是gcc编译器，楼主能否贴出你的运行结果。

user: user-2
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-0
content: 引用 1 楼 zhangxiangDavaid 的回复:int (*a)[3], *num[4]; 以上声明，a与num的区别是什么：  a的行数和b的列数都是未知数N

user: user-0
content: int main() {     int (*a)[3], *num[4];     int N, L, H, A, B, C, D, n, i, j;     scanf("%d %d %d", &N, &L, &H); //指针分配     a=(int (*)[3])malloc(sizeof(int*) *N);     for (i=0; i<4; i++)                                    num[i]=(int *)malloc(sizeof(int) *N);     for (i=0; i<N; i++)         scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]); //调试1     printf("\n");     for (i=0; i<N; i++)         printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]); //执行     A=B=C=D=0;     for (i=0; i<N; i++)     {         if (a[i][1]>=L && a[i][2]>=L)             if (a[i][1]>=H && a[i][2]>=H)                 num[0][A]=i;             else if (a[i][1]>=H && a[i][2]<H)                 num[1][B]=i;             else if (a[i][1]<H && a[i][2]<H && a[i][1]>=a[i][2])                 num[2][C]=i;                else                 num[3][D]=i;     } //调试2        printf("\n");     for (i=0; i<N; i++)         printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);           return 0; } 引用 2 楼 paschen 的回复:使用了未初始化的局部变量 A B C D  ABCD初始化以后问题仍然存在？

user: user-3
content: 使用了未初始化的局部变量 A B C D

user: user-4
content: int (*a)[3], *num[4]; 以上声明，a与num的区别是什么：

user: user-0
content: 逐行输入和全部一起输入都可行。每行三个数字，数字之间有空格。

user: user-3
content: 引用 3 楼 tqjxlm 的回复:int main() {     int (*a)[3], *num[4];     int N, L, H, A, B, C, D, n, i, j;     scanf("%d %d %d", &N, &L, &H); //指针分配     a=(int (*)[3])malloc(sizeof(int*) *N);     for (i=0; i<4; i++)                                    num[i]=(int *)malloc(sizeof(int) *N);     for (i=0; i<N; i++)         scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]); //调试1     printf("\n");     for (i=0; i<N; i++)         printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]); //执行     A=B=C=D=0;     for (i=0; i<N; i++)     {         if (a[i][1]>=L && a[i][2]>=L)             if (a[i][1]>=H && a[i][2]>=H)                 num[0][A]=i;             else if (a[i][1]>=H && a[i][2]<H)                 num[1][B]=i;             else if (a[i][1]<H && a[i][2]<H && a[i][1]>=a[i][2])                 num[2][C]=i;                else                 num[3][D]=i;     } //调试2        printf("\n");     for (i=0; i<N; i++)         printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);           return 0; }  [quote=引用 2 楼 paschen 的回复:] 使用了未初始化的局部变量 A B C D  ABCD初始化以后问题仍然存在？[/quote]  没发现哪不一样，请把问题描述清楚，输入时要怎么输入