Cのポインタで基本的な質問があります。
例えば、
char x = 'a';
と書いた場合、
xの中身は'a'で、
xのアドレスは&xで知ることができますが、
この場合、コンパイラは
変数名xとxのアドレス&xの2つを知っている必要があると思うのですが、
この変数名xとxのアドレス&xはコンパイラによってメモリ上のどこかのアドレスに
書き込まれると思うのですが、メモリマップ上で書くと、これらの位置関係はどのように
なっているのでしょうか?
簡単なメモリマップの図を描いて説明していただけると助かります。
No.2ベストアンサー
- 回答日時:
int x = 10;
int y = 20;
printf("%d\n", x+y);
みたいな処理を考えた場合
変数にxやyみたいな名前をつけるのは、人間がソースを書く上で理解しやすいようにする為です。
コンパイル時には、コンパイラは
変数xの場所は100番地、変数yの場所は200番地という様にメモリ上に場所を割り付けて
変数名と割り付けたアドレスの対応表を作成します。
そして、ある変数(例えばx)がソースに現れた場合には、
対応表をみて対応するアドレス(100番地)にアクセスするようなコードを生成します。
できた実行ファイルは
100番地のデータと200番地のデータを読み出して足した結果を、printfの処理に渡す
みたいな動作をします。
この時には、変数名のxだのyだのは存在しません。
変数名とアドレスの対応表はコンパイル時にしか存在しません。
No.3
- 回答日時:
> 実行ファイルになった時点では変数のアドレスは即値で対応しているという理解でいいのでしょうか?
No.2です。
多分に語弊がある回答になってしまいますが
今の質問者様には「良い」という回答で良いと思います。
詳しく理解されたいのでしたらコンパイル結果をアセンブリ言語で出力をしてみて
どの様なコードになるのか見てみるのが良いです。
No.1
- 回答日時:
> この場合、コンパイラは
> 変数名xとxのアドレス&xの2つを知っている必要があると思うのですが、
コンパイル、リンクする際には、実行時にxの格納されるアドレスは必要ありません。
> この変数名xとxのアドレス&xはコンパイラによってメモリ上のどこかのアドレスに
> 書き込まれると思うのですが、
メモリ上に書き込みされるのはコンパイルの時でなくて、実行時では?
1.△△.cのファイルをコンパイルして、△△.oのオブジェクトファイルを作成。
2.△△.oなどをリンクして、△△.exeの実行形式を作成。
3.作成された△△.exeを実行。
って流れを理解していますか?
> メモリマップ上で書くと、これらの位置関係はどのように
> なっているのでしょうか?
printf("xのアドレス(&x)=%p\n", &x);
とかで、アドレス表示してみるのが良いのでは。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- VPN 接続のたびにIPが変わるVPNサービスが知りたい 2 2022/06/27 02:34
- ドライブ・ストレージ windows10。切り取りと貼り付けは書き込み動作になりますか 3 2022/06/08 17:04
- SoftBank(ソフトバンク) スマホ ipアドレス 4 2022/08/24 01:26
- その他(コンピューター・テクノロジー) 企業の問い合わせフォームに、名前もアドレスも嘘の書き込みをしました。 身元はバレますか? スマホから 1 2022/06/18 17:51
- FTTH・光回線 グローバルIPアドレスの変更について 1 2022/04/23 05:32
- Outlook(アウトルック) Excel表のメールアドレスリストからoutlookの宛先を設定、メールを送信する方法 2 2022/09/16 05:29
- Wi-Fi・無線LAN iPhoneのIPアドレスは機内モードをオンで変わるように、無線ルーターも何かの方法で変更できる? 2 2022/04/02 14:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++ で、「)」が必要 というエ...
-
0除算して、落ちるプログラムと...
-
C++でアボート(Abort)で処理が...
-
visual studio 2005でC言語は学...
-
関数の戻り値による変数の初期化
-
プリコンパイラとは?
-
Eclipseの環境設定について
-
graph.hがincludeできない
-
io.hをincludeするとそのような...
-
初心者はIDE使わないほうが良く...
-
volatile修飾について
-
C言語のmakefileについて
-
Windows環境でgnu系コンパイラ...
-
Cのコンパイラの変数名の処理の...
-
conio.h? curses.h?
-
Visual C++とVisual C++.NETの違い
-
困っています。
-
fortrn77のフリーソフト
-
65536は2の何乗なのでしょうか?
-
Excelで4096点以上のFFTの方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
CPUが16bitでも32bitOSでコンパ...
-
C++ で、「)」が必要 というエ...
-
C++でアボート(Abort)で処理が...
-
コンパイルできない
-
io.hをincludeするとそのような...
-
変数(関数)名の頭に_
-
コンパイラについて
-
fortranでのNaNについて
-
ABAQUS ユーザーサブルーチン...
-
volatile修飾について
-
Visual C++とVisual C++.NETの違い
-
コンパイラの制限 : ヒープの領...
-
Eclipseの環境設定について
-
graph.hがincludeできない
-
Delphiの逆コンパイル
-
sprintfを用いたフォーマット文...
-
プリコンパイラとは?
-
COBOL用のテキストエディタ
-
PICマイコンによる乱数の表示に...
おすすめ情報
変数Xとそのアドレスの対応は、
メモリ上のデータ領域に辞書の様なデータ構造で書き込まれて、
そこから参照されているのでしょうか?
それとも実行ファイル内にアドレスの即値としてそのまま書き込まれているのでしょうか?
確認ですが、
>変数名とアドレスの対応表はコンパイル時にしか存在しません。
ということは、実行ファイルになった時点では変数のアドレスは即値で対応しているという
理解でいいのでしょうか?