プロが教える店舗&オフィスのセキュリティ対策術

Cのポインタで基本的な質問があります。
例えば、

char x = 'a';
と書いた場合、
xの中身は'a'で、
xのアドレスは&xで知ることができますが、
この場合、コンパイラは
変数名xとxのアドレス&xの2つを知っている必要があると思うのですが、
この変数名xとxのアドレス&xはコンパイラによってメモリ上のどこかのアドレスに
書き込まれると思うのですが、メモリマップ上で書くと、これらの位置関係はどのように
なっているのでしょうか?
簡単なメモリマップの図を描いて説明していただけると助かります。

質問者からの補足コメント

  • 変数Xとそのアドレスの対応は、
    メモリ上のデータ領域に辞書の様なデータ構造で書き込まれて、
    そこから参照されているのでしょうか?
    それとも実行ファイル内にアドレスの即値としてそのまま書き込まれているのでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/02/12 19:32
  • 確認ですが、

    >変数名とアドレスの対応表はコンパイル時にしか存在しません。

    ということは、実行ファイルになった時点では変数のアドレスは即値で対応しているという
    理解でいいのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/02/12 21:05

A 回答 (3件)

int x = 10;


int y = 20;
printf("%d\n", x+y);

みたいな処理を考えた場合
変数にxやyみたいな名前をつけるのは、人間がソースを書く上で理解しやすいようにする為です。

コンパイル時には、コンパイラは
変数xの場所は100番地、変数yの場所は200番地という様にメモリ上に場所を割り付けて
変数名と割り付けたアドレスの対応表を作成します。
そして、ある変数(例えばx)がソースに現れた場合には、
対応表をみて対応するアドレス(100番地)にアクセスするようなコードを生成します。

できた実行ファイルは
100番地のデータと200番地のデータを読み出して足した結果を、printfの処理に渡す
みたいな動作をします。
この時には、変数名のxだのyだのは存在しません。


変数名とアドレスの対応表はコンパイル時にしか存在しません。
この回答への補足あり
    • good
    • 0

> 実行ファイルになった時点では変数のアドレスは即値で対応しているという理解でいいのでしょうか?



No.2です。
多分に語弊がある回答になってしまいますが
今の質問者様には「良い」という回答で良いと思います。

詳しく理解されたいのでしたらコンパイル結果をアセンブリ言語で出力をしてみて
どの様なコードになるのか見てみるのが良いです。
    • good
    • 0

> この場合、コンパイラは


> 変数名xとxのアドレス&xの2つを知っている必要があると思うのですが、

コンパイル、リンクする際には、実行時にxの格納されるアドレスは必要ありません。


> この変数名xとxのアドレス&xはコンパイラによってメモリ上のどこかのアドレスに
> 書き込まれると思うのですが、

メモリ上に書き込みされるのはコンパイルの時でなくて、実行時では?

1.△△.cのファイルをコンパイルして、△△.oのオブジェクトファイルを作成。
2.△△.oなどをリンクして、△△.exeの実行形式を作成。
3.作成された△△.exeを実行。
って流れを理解していますか?


> メモリマップ上で書くと、これらの位置関係はどのように
> なっているのでしょうか?

printf("xのアドレス(&x)=%p\n", &x);

とかで、アドレス表示してみるのが良いのでは。
この回答への補足あり
    • good
    • 0

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