int main()
{
char *c = "abc";
*c = 'd';
printf("%s",c);
return 0;
}
このプログラムをCで実行しようとすると、プログラムがクラッシュします。ここでのエラーを知りたいですか?
int main()
{
char *c = "abc";
*c = 'd';
printf("%s",c);
return 0;
}
このプログラムをCで実行しようとすると、プログラムがクラッシュします。ここでのエラーを知りたいですか?
文字列リテラルabc
は実際にはプロセスの読み取り専用領域に格納されており、変更することは想定されていないためです。オペレーティングシステムが対応するページを読み取り専用としてマークし、そこに書き込もうとするとランタイム例外が発生します。
文字列リテラルをポインタに割り当てるときはいつでも、コンパイラがそのような問題について警告するようにchar
、常にそれを修飾してください。const
const char *c = "abc";
*c = 'd'; // the compiler will complain
文字列リテラルを本当に変更したい場合(直接ではありませんが、そのコピー)、次を使用することをお勧めしstrdup
ます:
char *c = strdup("abc");
*c = 'd'; // c is a copy of the literal and is stored on the heap
...
free(c);
"abc"
文字列リテラルです。
*c = 'd'
その文字列リテラルを変更する試みです。
文字列リテラルは変更できません。