gcc-3.xの場合、-f[no-]writable-stringsで、書き込み可能な領域に文字列リテラルを書き込むか選択でき、-f[no-]merge-constantsで、同じ文字列(と、浮動小数点定数)を同じ領域に確保するか選択できますよ。
デフォルトは、-fno-writable-stringsと-fmerge-constantsです。
2.95.xは未確認ですが、この手のオプション選択機能は、古めのコンパイラ(10年近く前のコンパイラ--THINK C 6.0にもありました)でも持っている機能なので、2.95ともなると当然のようにあるのではないでしょうか。
わりとFAQですよん(特にその2) (スコア:1)
その1について:
宣言は、記憶クラス指定子(auto、static等)、型指定子(int、double等)、修飾子(const、volatileの2つ)が、任意の順番で現れたものの後に宣言子(ポインタ、配列、引数リスト、修飾子を含む識別子)のリストがくっついたものです。正確な定義はプログラミング言語C 第2版 付録AのA8節、A8.5節あたりを参照のこと。
なので、int const *とconst int *は同じ意味で、「(読み込み専用のint)へのポインタ」。int * constは、ポインタがconst修飾されているので、「intへの(読み込み専用のポインタ)」となります。 余談ですが、宣言にまつわるトリビアでも。
巧妙に潜伏したバグは心霊現象と区別が付かない。
Re:わりとFAQですよん(特にその2) (スコア:1)
その1 については、一応分かってはいたのですが自分の理解で間違いないのかどうか確認したかったので。
しかし、記憶クラス指定子とか修飾子とかそういったところまで深くは考えていなかったので、なるほどな~、と思いました。
その2 については、 FAQ でしたか (^^;
何処だったかで
char *ptest = "test";
と
char stest[] = "test";
char *ptest = stest;
と
char stest[] = "test";
char *ptest = &stest[0];
が等価であるというような解説があったので、「2番目と3番目は同じだけど、1番目は違わないか? っていうかこれって書き換えようとしたらエラーにならない? コンパイルはできるの?」という疑問から始まったのでした。
実際、コンパイルしたものを実行してみるとセグメンテーションフォルトとなりました。というわけで、件の解説を信じちゃった人はご愁傷様です、って感じです。
んでも、それぞれコンパイルした時にマシン語レベルでどのような違いになるのか分からないと、なかなかこれらの違いは理解出来ないかもなぁ、とは思いますね。 1番目の場合は ptest は実行コード中に埋め込まれた文字列を直接参照するのに対し、 2・3番目では実行コード中に埋め込まれた文字列を一旦変数領域にコピーした後、 ptest はその変数を参照する、ということで合ってるかな。
Re:わりとFAQですよん(特にその2) (スコア:1)
char *ptest = "test" のとき "test" の実体がどこにあるかは、環境依存かな?
Re:わりとFAQですよん(特にその2) (スコア:0)
#include
main()
{
char *s1 = "test";
const char *s2 = "test";
char s3[] = "test";
const char s4[] = "test";
printf("s1=%s[%p]\n",s1,s1);
printf("s2=%s[%p]\n",s2,s2);
printf("s3=%s[%p]\n",s3,s3);
printf("s4=%s[%p]\n",s4,s4);
Re:わりとFAQですよん(特にその2) (スコア:1)
デフォルトは、-fno-writable-stringsと-fmerge-constantsです。
2.95.xは未確認ですが、この手のオプション選択機能は、古めのコンパイラ(10年近く前のコンパイラ--THINK C 6.0にもありました)でも持っている機能なので、2.95ともなると当然のようにあるのではないでしょうか。
また、(char *)と(char [])は、同一視されたりされなかったりしますが、基本的に別物です。 例外は、関数の引数宣言と、関数の引数にされた変数/定数のみです。
このへんに関する話題で、ある書籍からの引用を紹介します。 「エキスパートCプログラミング(Peter van der Linden著、梅原 系 訳、アスキー出版局)」という本のページ(第9章「配列についてもう少し」)から: 私は、これを読んで初めてポインタと配列の違いを理解しました。まあ、その前にろくな解説書に巡り合わなかっただけで、良質な解説書は他にもたくさんあるとは思いますが。
# 軽いノリの文体が性に合うなら、この本はかなりお勧め。というか、C関係の細かな話が出るたびに勧めてますな(笑)。
巧妙に潜伏したバグは心霊現象と区別が付かない。