0

重複の可能性:
文字列への書き込み時にセグメンテーション違反が発生するのはなぜですか?

int main()
{
    char *c = "abc";
    *c = 'd';
    printf("%s",c);
    return 0;
}

このプログラムをCで実行しようとすると、プログラムがクラッシュします。ここでのエラーを知りたいですか?

4

2 に答える 2

3

文字列リテラル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);
于 2012-05-31T13:45:52.057 に答える
1

"abc"文字列リテラルです。

*c = 'd'その文字列リテラルを変更する試みです。

文字列リテラルは変更できません。

于 2012-05-31T13:45:37.323 に答える