2017-08-15 56 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