K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[1940] 変数とは何か
返信


投稿者:var
2016/06/14 23:48:25

Link:
変数とは何か?という議論がWEBでされているのを見かけ自分の一抹の理解の不足を感じ、"C言語ポインタ完全制覇"を開きました。 

非常に分かりやすい説明で、変数の理解が得られた、と思ったと同時に、新しい疑問が湧きました。 

先の本の序盤で以下の例があります。 

int hoge = 5; 

変数hogeのアドレス(&hoge)は"0xbfbfd9e4"。 
そこに数値5をint型で配置する。 
これは分かるのですが、変数hoge自体は、誰がどこで管理しているのでしょうか。 

図表では、0xbfbfd9e4アドレスからの始まりに5が格納されており、これは分かります。 
しかし、同時に、"hoge"もあります。この辺りで混乱しております。 

0xbfbfd9efアドレスからintの大きさまで == hogeという変数

というその紐付けはまたどこかでやっている?ということでしょうか。 

恐らく基礎中の基礎のような気もしますが、調べる限り解答にたどり着けず、 
理路整然とした解説で好感持っている前橋様に質問させていただいた次第です。 

※ご迷惑おかけします。誤字あったため同内容で再投稿。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1941] Re:変数とは何か
返信


投稿者:(ぱ)こと管理人
2016/06/16 04:05:24

Link:
はじめまして。

>変数hogeのアドレス(&hoge)は"0xbfbfd9e4"。 
>そこに数値5をint型で配置する。 
>これは分かるのですが、変数hoge自体は、誰がどこで管理しているのでしょうか。 
>
>図表では、0xbfbfd9e4アドレスからの始まりに5が格納されており、これは分かります。 
>しかし、同時に、"hoge"もあります。この辺りで混乱しております。 

誤解を招いたなら申し訳ないですが、p.034のFig.1-1において、
図の中に「hoge」が書いてあるのは、読者にとってわかりやすくするためで、
プログラムの実行時に「hoge」という名前がどこかに保持されているわけではありません。
Cの場合、コンパイル時にデバッグオプションを付けたりしない限り、
たいていは、ローカル変数の変数名(この場合hoge)は、コンパイル後の
オブジェクトファイルに残ってすらいません。

ではどのように変数hogeを参照しているのかといえば、素朴な実装では、スタック内の、
現在実行中の関数の使用領域(p.095のFig.2-5において、「func()から見える領域」と
書いてある範囲。スタックフレームと言います)内の位置が、コンパイル後の
機械語コードに埋め込まれていて、それを使用して参照します。
こちらの図↓で言えば、BPからの相対位置でアクセスします。

http://www.c-tipsref.com/words/stackframe.html

グローバル変数やstatic変数は、リンクの時点でアドレスが決まります。
「2-4-2 分割コンパイルとリンク」を参照してください。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[1942] Re:変数とは何か
返信


投稿者:var
2016/06/16 23:47:13

Link:
ご回答ありがとうございました。

なるほど。

>コンパイル後の オブジェクトファイルに残ってすらいません。 
このあたりでピンときました。

スタックマシンタイプであれば、スタックポインタからの位置で参照できるため、
処理系が紐付けてくれているんですね。

変数という文字列なのかシンボルみたいなものがどこかで管理され、
それが参照する先が、例えば数字の5の格納位置を見ている、のようなイメージを持ってしまい混乱していまいました。


大変ありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]