次のようにして、C++で2次元配列を作成できます。しかし、私はメモリアドレッシングを理解するのに困っています。私はgccのバージョン4.7.1(TDM-1)コンパイラを使用して走ったC++の動的2次元配列のアドレス
(私はメモリ位置の小数点以下の値を印刷しようとするところに私のコードの最後の行に注意してください。)
#include <cstdio>
#include <iostream>
using namespace std;
#define rowSize 3
#define colSize 4
int main(){
int ** p;
p = new int*[rowSize];
for(int i = 0; i < rowSize; i++){
p[i]= new int[colSize];
}
printf("the size of int**: %d\n", sizeof(int**));
printf("the size of int*: %d\n", sizeof(int*));
printf("the size of int: %d\n\n", sizeof(int));
printf("%d %d", p[0], p[1]);
return 0;
}
私私の窓のプログラムは、10-64ビットマシンです。
int型のサイズ**:4
int型のサイズ*:4
int型のサイズ:4
8135000ここ
は、サンプル出力です8135024
ここに私の2つの質問があります:
16(= 4 * 4)ではなく24でアドレスが異なるのはなぜですか? intのサイズは4で、4列あります。彼らは16歳までに違いないでしょうか? 私は、C++の構造体でバイトパディングを知っています。このような何かの背後にある理由はありますか?
#define colSize 5
、再コンパイルして、もう一度プログラムを実行した:は、私は5にcolSizeを変えてみました。
サンプル出力:
the size of int**: 4 the size of int*: 4 the size of int: 4 7151960 7151992
バイトのパディングが理由であった場合にアドレスが32だけ異なる。この時間は、5列は5×4 = 20バイトを必要とするであろう。この場合、4バイトのパディングで十分であり、アドレスもこの場合24だけ異なるはずです。
この場合、なぜ32で違いますか?
どのような回答がお望みですか? gccの実装の詳細を説明していますか?あるいは、「質問がどのようにレイアウトされているかは保証されていません。あなたはそれらについて予測するべきではありませんが、XとYに頼らなければならない場合は、これを使用してください...」とすれば十分でしょうか? – VolkerK
実際の2次元配列で同じことを試してください:int p [3] [4]; –
はい、その差を計算することができます。しかし、私は 'new int [colSize]'が何らかのパターンでアドレスを返すかどうかを理解することにもっと興味がありました。 –