- ベストアンサー
論理アドレスの割り当て方法
現在、どのようにプログラムが実行されているかについて調べているのですが、Cプログラムをコンパイルする際に、変数に対してどのように論理アドレス(再配置可能アドレス)は割り当てられるのでしょうか?自分としては、変数の宣言された順に割り当てられるのかなぁと思っているのですが、実際どうなのかがわかりません。お願いします。教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 変数に対してどのように論理アドレス(再配置可能アドレス)は割り当てられるのでしょうか? OSなどの処理系ごとに異なります。 main() { int a,b,c; printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c); } などのプログラムを作成して調べてみては? 変数の宣言を、グローバル、static、レジスタ(?)などと変えてみても面白いと思います。 -- Intel系ですと、スタックの末尾から宣言した順に前向きに…だったと思います。 何かの間違いで大量のメモリを確保してしまった場合、前向きに確保して行けば、前方にあるプログラム領域に到達して、メモリ破壊してプログラムが停止するので、他のメモリ領域に影響を与えないというような説明を聞いた事があります。ちょっと眉唾ですが。
その他の回答 (1)
- khurata
- ベストアンサー率40% (54/134)
リンケージまで終了した段階のアドレスであるならば、#1の回答でよろしいかと存じます。 もし、コンパイル後リンク前のオブジェクトの段階(再配置可能)でのアドレスを知りたいならば、マップリストを出力するオプションを付けてコンパイルすれば、各変数や関数のリロケータブルなメモリマップが得られます。 また、リンク後のプログラムについて知るなら、#1の回答の他に、リンクマップを出力するオプションを用いたり、アセンブリ言語で出力するオプションを用いるという方法もあります。 コンパイルオプションについては処理系依存ですので、ご使用の処理系について調べて頂ければ、と思います。