プロが教えるわが家の防犯対策術!

例えば
 #define TANAKA "田中"
と宣言した場合に、この#define文はメモリ上のスタック領域、動的記憶領域、プログラム領域、静的記憶領域のどの領域に格納されるのでしょうか?またはそれ以外の領域なのでしょうか?

またこのTANAKAと"田中"はどのような関連付けになっているのでしょうか?ポインタのように"田中"の先頭アドレスがTANAKAと名づけられた何かに格納されているのでしょうか?

よろしくお願いいたします。

A 回答 (5件)

★関連付けられている訳ではありません。


・『#define』の『TANAKA』はコンパイルする前の段階で『"田中"』という
 文字列定数に置き換えられます。つまり、プリプロセッサ処理されるの
 です。『プリ』とは『前処理』って意味です。
・よって、文字列定数と同じ『静的記憶領域』に格納されます。
・分かりますか?
・文字列の記号定数は『文字列定数』と同じため『静的記憶領域』に格納。
・整数値の記号定数は『プログラム領域』と同じコード部に格納されます。
・以上。おわり。
    • good
    • 1

正確なチェックではないですが、他の変数とアドレスを比較してみれば何となく分かると思います。



#include <stdio.h>
#include <stdlib.h>
#define TANAKA "田中"
#define SINTYO 180

char *s1 = "邦衛";
char *s2 = TANAKA;
int i1 = 123;
int i2 = SINTYO;

void main(void)
{
char *s3 = "邦衛";
char *s4 = TANAKA;
char *s5;
int i3 = 123;
int i4 = SINTYO;
s5 = (char *)malloc(1);

printf("pg:%p\n",main);
printf("s1:%p\n",s1);
printf("s2:%p\n",s2);
printf("s3:%p\n",s3);
printf("s4:%p\n",s4);
printf("s5:%p\n",s5);
printf("i1:%p\n",&i1);
printf("i2:%p\n",&i2);
printf("i3:%p\n",&i3);
printf("i4:%p\n",&i4);

}

うちの環境での実行結果
pg:0040123C
s1:004180B4
s2:004180B9
s3:004180BE
s4:004180C3
s5:00912F50
i1:004180AC
i2:004180B0
i3:0012FF84
i4:0012FF80


pg:プログラム
i1,i2,s1-s4:静的
s5:動的
i3,i4:スタック

プログラムと静的の境界は判断できないかも。
i3,i4のアドレスが逆転しているのはスタックの特徴?

正確ではないですが、参考程度にはなるかと。
    • good
    • 0

> もしよければ具体的にどうやって調べればよいか教えていただけますでしょうか?助かります。



まずは、使用されている処理系が何であるかを確認してください。そして、アセンブリ言語のソースを出力させる方法(多くの場合はコンパイルオプション)をマニュアルで調べてみてください。
    • good
    • 0

既に回答が出ているように、#define指令で定義したマクロは前処理で置換されます。



マクロが使用された場合には"田中"という文字列がメモリ上に配置されることになります。
C言語の規格上は、マクロが使用された文脈により、静的記憶域期間または自動記憶域期間(自動配列の初期化子として使用された場合)になります。sizeof演算子のオペランドに使用された場合はメモリ上には配置されません。

規格上の話ではなく、実際にどうなるかに関しては、処理系に強く依存しますし、最適化結果にも依存しますので、コンパイル結果を調べてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
もしよければ具体的にどうやって調べればよいか教えていただけますでしょうか?助かります。

お礼日時:2007/01/10 16:59

#define TANAKA "田中"



プリプロセッサがコンパイル前に置換します。つまり、コンパイルの段階では、ソースコードに TANAKA は存在しない状態になります。

エディタで TANAKA を "田中" に置換してからコンパイルするのと同じです。

実行形式のファイルには TANAKA に関する情報は残りません。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。
なるほど、いちいち置き換えるのではなくてプリプロセッサが予め全てを書き換えてしまってたんですね。

ありがとうございます。

お礼日時:2007/01/10 14:46

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A