重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (2件)

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



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

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

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

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

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



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

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

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!