2016-09-27 12 views
-1

変数のアドレス空間が私のプログラムで変化しているようです。最初に、以下のプログラムからの出力を得ました。Cプログラムで変数のアドレス空間が変更される

int main(){ 
int a = 10; 
int *b = &a; 
int **c = &b; 
int ***d = &c; 
printf("a - address: %p, value: %x\n",&a ,a); 
printf("b - address: %p, value: %x\n",&b ,b); 
printf("c - address: %p, value: %x\n",&c ,c); 
printf("d - address: %p, value: %x\n",&d ,d); 
printf("size: a - %d, b - %d c- %d, d - %d", sizeof(a), sizeof(b), sizeof(c), sizeof(d)); 
} 

出力:

a - address: 0x7ffc08c5866c, value: a 
b - address: 0x7ffc08c58660, value: 8c5866c 
c - address: 0x7ffc08c58658, value: 8c58660 
d - address: 0x7ffc08c58650, value: 8c58658 

0xcとしてabのアドレスの違いがあります。

その後、私が追加:

int f = 10; 

私はこの出力を得る:

f - address: 0x7fff1945656c, value: a 
a - address: 0x7fff19456568, value: a 
b - address: 0x7fff19456560, value: 19456568 
c - address: 0x7fff19456558, value: 19456560 
d - address: 0x7fff19456550, value: 19456558 

aと変更bのアドレスの違いを。なぜ誰かが私に言うことができますか?

+1

コンパイラはあなたの変数のメモリを好きなように整理することができます...詳細な説明が必要な場合は、Cで整列と埋め込みについて読むこともできます。ポインタ値を '%p'で表示することも忘れないでください。 –

+0

同じプログラムを2回実行する異なるアドレスを取得しますか?これは、スタック配置のランダム化による可能性があります。 – 1201ProgramAlarm

+0

いいえ、intの前にint宣言を追加すると、aのアドレスとbのアドレスの差は12から4へと12へと変化します。 –

答えて

0

intは4バイト、ポインタは8バイトです。ポインタは、そのアドレスが8の倍数である場合、それは16進数アドレスがintは同様ので、2つのintは同一に格納することができる4の配向を有する8または0

終了する「最良の」動作します1つのポインタとしてのスペース。 fを追加すると、最初の4バイトが使用され、さらにの4バイトが「プッシュ」されます。これらのバイトは以前は使用されていなかったため、bは8バイトの境界から開始することができました。

それでも、ポインタbは前に使用したのと同じ0アドレスから開始する余地があります。

関連する問題