回答編集履歴
2
「念の為」部分の位置を修正
answer
CHANGED
@@ -11,15 +11,16 @@
|
|
11
11
|
bの番地は 0xffffcbf8 (~0xffffcbfb)
|
12
12
|
aの番地は 0xffffcbfc (~0xffffcbff)
|
13
13
|
|
14
|
+
念の為:例えばこういった関係になってますね。
|
15
|
+
- 0xffffcbe8(yの番地)+ 8 = 0xffffcbf0(xの番地)
|
16
|
+
- 0xffffcbf8(bの番地)+ 4 = 0xffffcbfc(aの番地)
|
17
|
+
|
14
18
|
これは実は
|
15
19
|
- double 型の変数 y, x がそれぞれ8バイト(64bit)の領域を占めている
|
16
20
|
- int 型の変数 b, a がそれぞれ4バイト(32bit)の領域を占めている
|
17
21
|
- y, x, b, a がメモリ上で連続(密着)している
|
18
22
|
|
19
23
|
ことを示しています(括弧内に書き加えたアドレスは、各変数に割り当てられた、最後のメモリのアドレス)。
|
20
|
-
念の為:例えばこういった関係になってますね。
|
21
|
-
- 0xffffcbe8(yの番地)+ 8 = 0xffffcbf0(xの番地)
|
22
|
-
- 0xffffcbf8(bの番地)+ 4 = 0xffffcbfc(aの番地)
|
23
24
|
|
24
25
|
というのは、この8バイト、4バイトという値(大きさ)は、double, int という、それぞれの型の変数に必要なメモリの大きさだからです。これらの大きさは sizeof() で確認できますので、質問者も次のようなコードで確かめてみると良いです。
|
25
26
|
```C
|
1
「たまたま密着」を修正。ほかに軽微な修正を。
answer
CHANGED
@@ -17,6 +17,9 @@
|
|
17
17
|
- y, x, b, a がメモリ上で連続(密着)している
|
18
18
|
|
19
19
|
ことを示しています(括弧内に書き加えたアドレスは、各変数に割り当てられた、最後のメモリのアドレス)。
|
20
|
+
念の為:例えばこういった関係になってますね。
|
21
|
+
- 0xffffcbe8(yの番地)+ 8 = 0xffffcbf0(xの番地)
|
22
|
+
- 0xffffcbf8(bの番地)+ 4 = 0xffffcbfc(aの番地)
|
20
23
|
|
21
24
|
というのは、この8バイト、4バイトという値(大きさ)は、double, int という、それぞれの型の変数に必要なメモリの大きさだからです。これらの大きさは sizeof() で確認できますので、質問者も次のようなコードで確かめてみると良いです。
|
22
25
|
```C
|
@@ -24,12 +27,12 @@
|
|
24
27
|
printf("size of int = %d\n", sizeof(int));
|
25
28
|
```
|
26
29
|
|
27
|
-
変数 y, x, b, a は関数内のローカル変数なのでスタック領域に割り当てられているはずです。そのアドレスが0xffffcbe8~0xffffcbff
|
30
|
+
変数 y, x, b, a は関数内のローカル変数なのでスタック領域に割り当てられているはずです。そのアドレスが0xffffcbe8~0xffffcbffなのだから、おおよそこの辺りがスタック領域となっているようだとわかります(スタックという言葉がわからなければコメントなり新たな質問をたてるなりしてください)。スタック領域がどこになるか、いつも同じではありません。コンパイラによって、OSによって、プログラムによって、様々な条件で大きく変わります。
|
28
31
|
|
29
32
|
注意すべきは y, x, b, a という順序はコンパイラが勝手に決めてよいことになっているので、常にこの順序になると思ってはいけない事です。この場合はたまたまそういう順序になったのです。
|
30
|
-
上
|
33
|
+
上の例は「密着」していますが、いつも密着しているとも限りません。~~この場合はたまたま密着したのです。~~この場合は、double型変数が2つ、int型変数が2つという組み合わせは密着が可能だということになります。密着しなかった=隙間ができた実例がZuihsinさんの回答にあります。ただ、あのコードなら必ず隙間ができるかというと、そうでもありません。質問者がご自分で試してみるとよいと思います。
|
31
34
|
|
32
|
-
ひとつ簡単な実験をしてみるのも面白いと思います。それは変数を定義する順序を変えてみることです。例えば今
|
35
|
+
もうひとつ簡単な実験をしてみるのも面白いと思います。それは変数を定義する順序を変えてみることです。例えば今
|
33
36
|
|
34
37
|
double x, y; int a, b;
|
35
38
|
|
@@ -41,4 +44,4 @@
|
|
41
44
|
- 定義する順序を変えたらメモリ上の並び順が変わったコンパイラ
|
42
45
|
- 定義する順序を変えてもメモリ上の並び順が変わらないコンパイラ
|
43
46
|
|
44
|
-
があります。
|
47
|
+
があります。3つのうち2つはGCCですが(どちらもGCCなのに)この振る舞いが異なりました。ことほどさように、変数がメモリ上にどう配置されるかはコンパイラ次第です。アドレスは確かめてみないとわからないのです、もっともそんなことを気にしてプログラムを書くことは少ないですが。
|