- ベストアンサー
#defineが使用するメモリ領域について
例えば #define TANAKA "田中" と宣言した場合に、この#define文はメモリ上のスタック領域、動的記憶領域、プログラム領域、静的記憶領域のどの領域に格納されるのでしょうか?またはそれ以外の領域なのでしょうか? またこのTANAKAと"田中"はどのような関連付けになっているのでしょうか?ポインタのように"田中"の先頭アドレスがTANAKAと名づけられた何かに格納されているのでしょうか? よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
★関連付けられている訳ではありません。 ・『#define』の『TANAKA』はコンパイルする前の段階で『"田中"』という 文字列定数に置き換えられます。つまり、プリプロセッサ処理されるの です。『プリ』とは『前処理』って意味です。 ・よって、文字列定数と同じ『静的記憶領域』に格納されます。 ・分かりますか? ・文字列の記号定数は『文字列定数』と同じため『静的記憶領域』に格納。 ・整数値の記号定数は『プログラム領域』と同じコード部に格納されます。 ・以上。おわり。
その他の回答 (4)
- venzou
- ベストアンサー率71% (311/435)
正確なチェックではないですが、他の変数とアドレスを比較してみれば何となく分かると思います。 #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のアドレスが逆転しているのはスタックの特徴? 正確ではないですが、参考程度にはなるかと。
- jacta
- ベストアンサー率26% (845/3158)
> もしよければ具体的にどうやって調べればよいか教えていただけますでしょうか?助かります。 まずは、使用されている処理系が何であるかを確認してください。そして、アセンブリ言語のソースを出力させる方法(多くの場合はコンパイルオプション)をマニュアルで調べてみてください。
- jacta
- ベストアンサー率26% (845/3158)
既に回答が出ているように、#define指令で定義したマクロは前処理で置換されます。 マクロが使用された場合には"田中"という文字列がメモリ上に配置されることになります。 C言語の規格上は、マクロが使用された文脈により、静的記憶域期間または自動記憶域期間(自動配列の初期化子として使用された場合)になります。sizeof演算子のオペランドに使用された場合はメモリ上には配置されません。 規格上の話ではなく、実際にどうなるかに関しては、処理系に強く依存しますし、最適化結果にも依存しますので、コンパイル結果を調べてください。
- venzou
- ベストアンサー率71% (311/435)
#define TANAKA "田中" プリプロセッサがコンパイル前に置換します。つまり、コンパイルの段階では、ソースコードに TANAKA は存在しない状態になります。 エディタで TANAKA を "田中" に置換してからコンパイルするのと同じです。 実行形式のファイルには TANAKA に関する情報は残りません。
お礼
早速のご回答ありがとうございました。 なるほど、いちいち置き換えるのではなくてプリプロセッサが予め全てを書き換えてしまってたんですね。 ありがとうございます。
お礼
ありがとうございます。 もしよければ具体的にどうやって調べればよいか教えていただけますでしょうか?助かります。