2017-08-15 57 views
-6

我试图动态分配的二维数组的内存,但我不知道什么是错。如何动态在2D阵列和存储值分配存储器?

错误
让输入是

2 2 
1 2 3 4 5 6 7 8 9 ........ 

然后程序崩溃

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    int N,M; 
    int i,j; 
    scanf("%d %d",&N,&N); 

    int **A = (int **)malloc(N*sizeof(int *)); 

    for(i=0;i<N;i++) 
    { 
     A[i] = (int *)malloc(M*sizeof(int)); 
    } 

    for(i=0;i<N;i++) 
    { 
     for(j=0;j<M;j++) 
     { 
      scanf("%d",&A[i][j]); 
     } 
    } 

    for(i=0;i<N;i++) 
    { 
     for(j=0;j<M;j++) 
     { 
      printf("%d",A[i][j]); 
     } 
    } 

    return 0; 
} 
+2

你没有提供证据证明你是错的,甚至是你所说的“错误”的意思。 –

+0

什么问题?这似乎确定。除了铸造'malloc' –

+2

_I不知道什么是wrong_你怎么知道什么是错的?你有任何编译错误,崩溃,意外的结果? – litelite

回答

1

正如我所说的问题是在扫描NM变量。

变化

scanf("%d %d",&N,&N); 

scanf("%d",&N); 
scanf("%d",&M); 

和你的罚款。

问题是您在读两次N,而没有读取使用未初始化的M

非静态变量(局部变量)是不确定。在分配值之前读取它们会导致未定义的行为。


您应该释放所有分配的内存

for(i=0;i<N;i++) 
{ 
    free(A[i]); 
} 
free(A); 

和不投malloc()的返回值becouse

  • 其reduntand
  • 添加转换可以掩盖失败包括头stdlib.h,其中,所述原型的malloc发现
  • 如果指针的类型改变,必须解决所有行代码,其中malloc()被称为投下

下一次,如果你不能找到一个bug,尝试使用调试器,看看到底是什么发生的事情,你可以看到变量的值,在这里,你会清楚地看到,Mscanf()初始化后,并没有改变。

2

这是你的问题:

scanf("%d %d",&N,&N); 

当您在数组维度读,你读入N两次,从不读入M。其结果是,的M的内容是不确定的,并试图读取该值调用undefined behavior

修复此输入为M值:

scanf("%d %d",&N,&M); 
+2

为什么这个完全正确的答案downvoted –

+0

哇? - 一个downvote!究竟是谁做的? – 4386427