重複の可能性:
C の char s[] と char *s の違いは何ですか?
何かを修正しようとするのではなく、一般的な質問のほうが多いので、私は C プログラミング言語の本を読んでいます。
char amessage[] = "blah";
char *pmessage = "blah";
1 つは char 配列であり、もう 1 つは文字列定数へのポインターです。彼らは char 配列を変更することは許容できると言いますが、未定義の動作を引き起こすため、文字列定数を変更しないでください。私の質問は次のとおりです。文字列定数は、char配列と同じようにメモリに格納されていませんか? なぜ私はそれを次のように変更できますか
char *p = "this is a string constant";
*(p+2) = 'a';
printf("%s", p);
ご想像のとおり、「これは文字列定数です」と出力されます。文字列定数は実行時に変更されるべきではないので、それがどのように理にかなっているのか理解できます。なぜなら、コードに取り組んでいる他の人/自分自身が、その値が変更されることを期待していないことを混乱させる可能性があるからです。 、トリガーされる可能性のある未定義の動作は何ですか?また、char配列がトリガーしない場合に、どのように機械的に逆火する可能性がありますか? 文字列定数がメモリ内でどのように機能し、コンパイラによってどのように認識されるかについて、何かが欠けているのではないかと思っています。