C++で2つの2D配列、スタックから割り当てられた配列、ヒープから割り当てられた配列の動作を調べています。ヒープとスタックに割り当てられた配列の動作が異なるのはなぜですか?
同じ形状の2次元配列を作成し、それらの配列にデータを取り込みます。次に、2つの異なるメソッドで配列を読み込もうとします。最初のものは単純な配列インデックスフォーマット "Arr [ROW] [COLUMN]"です。次に、私は、ポインタ逆参照を使用して配列を読み取り、ヒープ割り当て配列の2つの異なる結果が得られますが、スタック割り当て配列の結果は同じです。なぜ結果が違うのか理解しようとしています。私は誰かが提供できる明確化を感謝します。前もって感謝します。
#include <iostream>
using namespace std;
int main(){
int rows = 6;
int columns = 3;
// allocate from the stack.
double q[rows][columns];
// allocate from the heap.
double ** a;
a = new double*[rows];
for(int i = 0; i < rows; ++i){
a[i] = new double[columns];
}
// populate the arrays.
for(int i = 0; i < rows; ++i){
for(int j = 0; j < columns; ++j){
a[i][j] = columns*i+j;
q[i][j] = columns*i+j;
}
}
cout << "*****************" << endl;
cout << "Array indexing method." << endl;
cout << "*****************" << endl;
// print the heap allocated array using array indexing.
for(int i = 0; i < rows; ++i){
for(int j = 0; j < columns; ++j){
cout << a[i][j] << '\t';
}
cout << endl;
}
cout << "*****************" << endl;
// print the stack allocated array using array indexing.
for(int i = 0; i < rows; ++i){
for(int j = 0; j < columns; ++j){
cout << q[i][j] << '\t';
}
cout << endl;
}
cout << "*****************" << endl;
cout << "Pointer dereferencing method." << endl;
cout << "*****************" << endl;
// print the heap allocated array.
for(int i = 0; i < rows; ++i){
for(int j = 0; j < columns; ++j){
cout << *(&a[0][0] + columns*i + j) << '\t';
}
cout << endl;
}
cout << "*****************" << endl;
// print the stack allocated array.
for(int i = 0; i < rows; ++i){
for(int j = 0; j < columns; ++j){
cout << *(&q[0][0] + columns*i + j) << '\t';
}
cout << endl;
}
cout << "*****************" << endl;
// release the memory allocated to the heap.
for(int i = 0; i < rows; ++i){
delete[] a[i];
}
delete a;
return 0;
}
私が得た結果は次のとおり:
私が実行しているコードは、以下である、ヒープに割り当てられた配列のISN
*****************
Array indexing method.
*****************
0 1 2
3 4 5
6 7 8
9 10 11
12 13 14
15 16 17
*****************
0 1 2
3 4 5
6 7 8
9 10 11
12 13 14
15 16 17
*****************
Pointer dereferencing method.
*****************
0 1 2
0 3 4
5 0 6
7 8 0
9 10 11
0 12 13
*****************
0 1 2
3 4 5
6 7 8
9 10 11
12 13 14
15 16 17
*****************
そして、私は、出力の第3のブロックにそれを見ることができます正しく読み込まれていませんが、スタック割り当て配列はです。
もう一度おねがいします。
'ダブルQ [行] [列]; 'VLAsは標準のC++ではありません。 – user0042
これは問題ではありませんが、実際には 'std :: endl'が行う余分なものが必要ですか? '' \ n ''は行を終わらせます。 –
いいえ、私はそうではありません、あなたはこの例のために正しいです。\ nは大丈夫でしょう。 –