2016-03-31 18 views
0

私はプログラミングが初めてで、2次元配列を理解しようとしています。私はこのコードを書いて、コードが動作しているかどうかをテストするだけです。残念ながら、私はセグメンテーションエラーを取得しています。私はそれが私が書いた何かがコンパイラのために読めないことを意味することを知っているが、私はそれが何であるか分からない。すべてが私にとってうまく思えるからです。セグメンテーションフォールト2次元配列

#include<iostream> 


using namespace std; 


int main(){ 

    int col, row,i; 
    int **array; 

    cout << "How many rows?\n"; 
    cin >> row; 
    cout << "How many colomns\n"; 
    cin >> col; 

cout << "!!!!!!!!!!!!"; 

    array = new int*[row]; 
    for (int i = 0;i<row;i++){ 
      array[i] = new int[col]; 
    } 

     cout << "!!!!!!!!!!!!"; 

    for(i=0; i<row; i++){ 
     int x=1; 
     array[0][i]= x;; 
    x++; 
    } 
     cout << "!!!!!!!!!!!!"; 
    cout << array[row][col]; 

    for(i=0; i<row; i++){ 

    delete [] array[i]; 
    delete [] array; 
    } 
    return 0; 
} 

ERRORは次のとおりです。 " どのように多くの行セグメンテーションフォールト(コアダンプ) どのように多くのcolomns ?"

+0

'COUT <<配列[行] [COL]のようにループ 外xを初期化し;'範囲外です。 'array [row-1] [col-1]'はあなたが行ける深さです。 – WhozCraig

+0

x ++;何もしていない。 xは各ループ反復の終わりに範囲外になり、次の反復の開始時に再作成されます。 – mjwach

+0

最近、ポインタや配列、newやdeeteはC++では使われていません。 std :: vectorやstd :: shared_ptrのようなより健康的な選択肢があります。 –

答えて

1

array[0][i]= x;が間違って見えます。それは次のようになります:

array[i][0]= x; 

最初のインデックスは、行と秒のcolです。

cout << array[row][col];も、rowが範囲外です。

アレイを削除する方法

も間違っている、それは次のようになります。範囲外

for(i=row - 1; i >= 0; --i){ 
    delete [] array[i]; 
} 
delete [] array; 
+0

だからこのようにすべきですか? – pnewbie

0
cout << array[row][col]; 

を2次元のそれぞれに、他の人が言ってきたように。

for(i=0; i<row; i++){ 

delete [] array[i]; 
delete [] array; 
} 

アレイの要素を各要素ごとに1回ずつ3回削除しています。これはいい。配列自体も3回削除しています。これは危険で間違っています。

0

だから、このようにすべきですか?あなたが最後の要素を印刷する.IF

#include<iostream> 


using namespace std; 


int main(){ 

    int col, row,i; 
    int **array; 

    cout << "How many rows?\n"; 
    cin >> row; 
    cout << "How many colomns\n"; 
    cin >> col; 

    array = new int*[row]; 
    for (int i = 0;i<row;i++){ 
      array[i] = new int[col]; 
    } 

     cout << "!!!!!!!!!!!!"; 

    for(i=0; i<row; i++){ 
     int x=1; 
     array[i][0]= x;; 
    x++; 
    } 
     cout << "!!!!!!!!!!!!"; 
    for(i=0; i<row; i++){ 
     for(int j=0; j<col; j++){ 
      array[i][j]; 
     } 
    } 
    cout << array[row][col];  

    for(i=0; i<row; i++){ 

    delete [] array[i]; 
    delete [] array; 
    } 
    return 0; 
} 
+0

x ++;配列[i] [j];何もしませんが、彼らはまた何も害を与えません。配列を削除する。 3回も間違って実行されています(行が3の場合)。さもなければ私はコードを実行することによってそれを確認していませんが、問題はありません。 – mjwach

0

この行は、範囲cout << array[row][col];の外にある他の人が後述するように、その後cout << array[row-1][col-1];

にこの行を変更し、割り当てられたメモリに

for(i=0; i <row; i++){ 
    delete [] array[i];  
} 
delete [] array; 
を削除するためのコードです

以下のコードでは、xは常に1になる予定です。x++は無効です。

for(i=0; i<row; i++){ 
int x=1;  
array[0][i]= x; 
x++; 
} 

あなたが行ごとxをインクリメントしたい場合、この

int x=1; 
for(i=0; i<row; i++){  
    array[0][i]= x;; 
    x++; 
}