int ** b;
b = (int **)(new int[5 * 12]);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 12; j++) {
b[i][j] = 0;
}
}
行にaccess violation
エラーが表示されますb[i][j] = 0;
どこが間違っているのですか?
int ** b;
b = (int **)(new int[5 * 12]);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 12; j++) {
b[i][j] = 0;
}
}
行にaccess violation
エラーが表示されますb[i][j] = 0;
どこが間違っているのですか?
あなたのコードはメモリをに割り当てますがb
、それは後で設定しようとするものではありません。代わりに、b
割り当てられていないものを設定しようとします。
b
はタイプなのでint**
、式はオフセットをb[i]
指し、オフセットsizeof(int*)*i
を(b[i])[j]
追加しsizeof(int)*j
ます。全体として、フラットな1次元配列のインデックスを決定するために使用されるsizeof(int*)*i + sizeof(int)*j
オフセットとまったく同じではないオフセットのバイトにアクセスしています。sizeof(int)*(i*j)
1次元配列を要求していますが、2次元配列のように扱っています。それはうまくいきません。いつものようにキャスティングは責任があります。
b
は初期化されていないため、これを介してアクセスすると未定義の動作が発生します。
本当の問題は、 1つの次元を指定せずにbを2次元配列として使用する場合、コンパイラーはそのアクセスにインデックスを付ける方法を実際には知らないということです。次のように記述してみてください。
int (* b)[12];
b = new int[5][12];
ここで行うことは、 bを12要素配列へのポインターとして宣言することです。したがって、iインデックスでインデックスを作成すると、コンパイラーは、bに12を掛ける必要があることを認識します。
キャストを取り除き、割り当てたいタイプとそれを格納する変数のタイプを見つけます。キャストは間違いを隠しています。
問題は[i][j]
手段i*row_length+j
です。ただしrow_length
、この例では定義されていません。個々の要素へのアクセス方法を変更するか、スタックに配列を作成する必要があります。