K&R C (第 2 版、セクション 5.5) は次のように述べています (私が強調):
char amessage[] = "a message"; /* an array */
char *pmessage = amessage; /* a pointer */
amessageは、一連の文字とそれを初期化する '\0' を保持するのに十分な大きさの配列です。配列内の個々の文字は変更される場合がありますが、メッセージは常に同じストレージを参照します。OTOH、pmessageはポインターであり、文字列定数を指すように初期化されます。ポインターはその後、他の場所を指すように変更される場合があります。ただし、文字列の内容を変更しようとすると、結果は未定義です。
さて、私の質問は、Linux ボックスの gcc 4.6.1 (または c99) が、次のプログラムを -Wall でコンパイルしているときに警告を生成する必要があるかどうかです。
int main(void) {
char amessage[] = "a message";
char *pmessage = "a message";
pmessage[0] = 'b';
return 0;
}
(gccは警告を生成しないことがわかりました。上記を正しく解釈していれば、警告が生成されるはずです。)