2017-11-30 6 views
-6

これを実行するたびにメモリエラーが発生します。私も閉じていますか?C++関数から動的に割り当てられた2D配列を返す方法

int **createField(int N, int ** ary) { 
    ary = new int*[N]; 
    for(int i = 0; i < N; ++i) 
     ary[i] = new int[N]; 

    for(int i = 0; i < N; ++i) 
     for(int j = 0; j < N+1; ++j) 
      ary[i][j] = 0; 

    return ary; 
} 

int playGame (int N, int ** ary) { 
    cout<<"Enter the coordinates of the " << N << " shots:"<<endl; 
    for(int i = 0; i < N; i++) 
    { 
     for(int j = 0; j < N; j++) 
     { 
      cout<<"Enter element ["<<i<<"]["<<j<<"]: "; 
      cin>>ary[i][j]; 
     } 
    } 
    return 0; 
} 

int main() { 
    int N; 
    cout << "Enter the number of Redshirts: "; 
    cin >> N; 
    int** ary; 
    createField(N, ary); 
    playGame(N, ary); 
} 
+7

U、 'std :: vector'。 –

+4

あなたはcoutを使用しています - つまり、あなたはC++を使用しています。 Cタグを見ている人々はあなたの一般的な方向にトマトを起動します – UKMonkey

+2

この質問は週に少なくとも3回頼まれています。重複したリンクを読んでから、あなたのコードでCTRL + A/supprを使い、 'std :: vector >' –

答えて

2

次はary

int** ary; 
createField(N, ary); 

を初期化していない、それは

int** ary; 
ary = createField(N, ary); 

する必要がありますが、実際にcreateFieldの第2引数は不要ですので、それは

int **createField(int N) { 
    int** ary = new int*[N]; 
    for(int i = 0; i < N; ++i) 
     ary[i] = new int[N]; 

    for(int i = 0; i < N; ++i) 
     for(int j = 0; j < N+1; ++j) 
      ary[i][j] = 0; 

    return ary; 
} 
だろう

その後、

int** ary = createField(N); 

しかし、より良いは、手動でメモリを扱えないためにstd::vectorを使用することです。

+0

'ary = createField(N、ary);' => 'ary = createField(N);' –

+0

@ Jean-FrançoisFabre:これは私が言ったことです、いいえ? 'ary = createField(N、ary);'はコードを「うまく動作させる」ための最小限の変更です。コードを読み取り/安全にするには、追加の変更が必要です。 – Jarod42

+0

はい、OPは値を割り当てずに戻しています。 –

関連する問題