こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

論理アドレスの割り当て方法

現在、どのようにプログラムが実行されているかについて調べているのですが、Cプログラムをコンパイルする際に、変数に対してどのように論理アドレス(再配置可能アドレス)は割り当てられるのでしょうか?自分としては、変数の宣言された順に割り当てられるのかなぁと思っているのですが、実際どうなのかがわかりません。お願いします。教えてください。

投稿日時 - 2004-06-02 14:02:49

QNo.878556

すぐに回答ほしいです

質問者が選んだベストアンサー

> 変数に対してどのように論理アドレス(再配置可能アドレス)は割り当てられるのでしょうか?

OSなどの処理系ごとに異なります。

main()
{
int a,b,c;
printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c);
}

などのプログラムを作成して調べてみては?
変数の宣言を、グローバル、static、レジスタ(?)などと変えてみても面白いと思います。

--
Intel系ですと、スタックの末尾から宣言した順に前向きに…だったと思います。
何かの間違いで大量のメモリを確保してしまった場合、前向きに確保して行けば、前方にあるプログラム領域に到達して、メモリ破壊してプログラムが停止するので、他のメモリ領域に影響を与えないというような説明を聞いた事があります。ちょっと眉唾ですが。

投稿日時 - 2004-06-02 14:19:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

 リンケージまで終了した段階のアドレスであるならば、#1の回答でよろしいかと存じます。

 もし、コンパイル後リンク前のオブジェクトの段階(再配置可能)でのアドレスを知りたいならば、マップリストを出力するオプションを付けてコンパイルすれば、各変数や関数のリロケータブルなメモリマップが得られます。

 また、リンク後のプログラムについて知るなら、#1の回答の他に、リンクマップを出力するオプションを用いたり、アセンブリ言語で出力するオプションを用いるという方法もあります。

 コンパイルオプションについては処理系依存ですので、ご使用の処理系について調べて頂ければ、と思います。

投稿日時 - 2004-06-02 15:23:04

あなたにオススメの質問