-1

intの配列の値をポインターとして使用して、2次元動的配列を作成しようとしています。これを正確に言葉で表現する方法がわからないので、ここにコードがあります。見れば、私がやろうとしていることを理解できるかもしれません。

#include "stdafx.h"
#include <iostream>
using namespace std;

int main(){
    const int length =5;
    int arr[5]={1,1,3,9,1};
    int* AR[length];

    for (int i=0; i<length;i++) {
        for (int j=0; j<(arr[i]); j++){
            AR[i] = new int (arr[i]);
            AR[i][j]=93;
            cout<<"["<<AR[i][j]<<"] ";
        }
        cout<<endl;
    }

    for (int i = 0; i < length; i++) {
        for (int j=0; j<arr[i]; j++) {
            delete[] AR[i];  
            delete []&AR;
        }
    }
    return 0;
}

実行するとarr[] < 4完全に実行されますが、のサイズarrが4の値を超えると、クラッシュします。理由がわかりますか?

4

2 に答える 2

4

私もこの問題を抱えていました:

 AR[i] = new int[arr[i]] 

また

 AR[i] = (int *) malloc(sizeof(int) * arr[i])

説明:

 int * a = new int(5);

整数を作成し、それを5に設定して、その整数へのポインタを返します。

 int * a = new int[5];

これにより、5つの整数にスペースが割り当てられ、最初の整数へのポインターが返されます。

編集: また、削除を調整する必要があります

 for(int i = 0; i < first_dimension; ++i)
    delete [] AR[i];

 delete [] AR;

編集2: Wugが指摘しているように、メモリリークもあります。コードは今のところ機能しますが、「j」の反復ごとに、動的配列に新しいメモリを割り当て、以前に割り当てられた動的単一次元配列へのアクセスを本質的に失います。


これは、動的メモリ割り当てを学習するための非常に優れたWebサイトです。

http://www.cplusplus.com/doc/tutorial/dynamic/

于 2012-10-23T19:54:43.863 に答える
1

外側のループではなく内側のループにメモリを割り当てていました。これは、インデントが一貫している場合にキャッチしたものです。また、new int(arr[i])代わりに使用していましnew int[arr[i]]た(前者は、1つのintを割り当て、その値をに設定します。arr[i]後者は、intの配列を割り当てarr[i]ます。

2番目のループでは、スタック変数を繰り返し解放していました。これは、double nonoです。割り当てられたメモリを解放するのは1回だけで、スタックで宣言された変数は解放しません。

クリーンアップされたコードは次のとおりです。

for (int i = 0; i < length; i++)
{
                             // moved outside of inner loop
    AR[i] = new int[arr[i]]; // used int[arr[i]] instead of int(arr[i])
    for (int j = 0; j < arr[i]; j++)
    {
        AR[i][j] = 93;
        cout << "[" << AR[i][j] << "] ";
    }
    cout << endl;
}

for (int i = 0; i < length; i++)
{
    delete[] AR[i]; // removed incorrect delete statement and incorrect inner loop
}
于 2012-10-23T20:00:48.087 に答える