文字列リテラルと C 文字列についていくつか質問があります。
したがって、次のようなものがある場合:
char cstr[] = "c-string";
私が理解しているように、文字列リテラルは、たとえばアドレス 0xA0 から始まり 0xA9 で終わるなど、終端の null バイトを使用してメモリ内に作成され、そこからアドレスが返されるか、型 char [ ] にキャストされます。住所・アドレス。
これを実行することは合法です:
for (int i = 0; i < (sizeof(array)/sizeof(char)); ++i)
cstr[i] = 97+i;
この意味で、型 char [ ] にキャストされている限り、文字列リテラルを変更できますか?
しかし、通常のポインターでは、メモリ内の文字列リテラルを指すと、ほとんどのコンパイラが割り当てられたメモリを定数の下限アドレス空間で「読み取り専用」としてマークするため、内容を変更できないことがわかりました。
char * p = "const cstring";
*p = 'A'; // illegal memory write
私が理解しようとしているのは、配列のように char * 型が文字列リテラルを指して定数を変更できないのはなぜですか? 文字列リテラルが char [ ] のように char * にキャストされないのはなぜですか? ここで間違った考えを持っている場合、または完全に間違っている場合は、お気軽に修正してください。