int main()
{
char *s="Hello";
*s="World";
printf("%s\n",s);
}
上記のプログラムでセグメンテーション違反が発生するのはなぜですか?
int main()
{
char *s="Hello";
*s="World";
printf("%s\n",s);
}
上記のプログラムでセグメンテーション違反が発生するのはなぜですか?
int main()
{
char *s="Hello"; // makes 's' point to a constant
*s="World"; // modifies what 's' points to
printf("%s\n",s);
}
コードの最初の行はs
、定数を指しています。s
2 行目は、何を指すかを変更しようとします。したがって、定数を変更しようとしていますが、定数は...まあ...定数であるため、実行できません。
ここには 2 つの問題があります。
ステートメント
*s = "World";
文字 s
列の最初の文字"Hello"
、または'H'
. char
したがって、ポインター値 (文字列 "World" のアドレス) を単一のオブジェクト ("Hello"
文字列リテラル の最初の文字) に割り当てようとしています。
しかし...
一部のシステム (あなたのシステムなど) では、文字列リテラルが読み取り専用データ セグメントに格納されており、一部のシステムでは読み取り専用メモリを変更しようとするとランタイム エラーが発生します。したがって、クラッシュ。
"World" 文字列リテラルs
を指すように変更するには、逆参照をドロップするだけです。
s = "World";
*s は s[0] と同じです。s[0] には 1 文字を格納する余地があります。この場合は「W」です。
そのキャラクターには「ワールド」の場所を格納する余地がありません。
そのため、セグメンテーション違反が発生しています。
*s
は文字列の最初の文字であるため、文字列を文字に割り当てるとエラーが発生します。
文字列を使用したい場合s = "world"
int main()
{
char *s="Hello";
s="World";
printf("%s\n",s);
}
今すぐ試してみてください。
char*s="hello";
ここs
は読み取り専用の場所にあります。したがって、別の文字列を割り当てることはできますが、新しい文字列を書き換えることはできません。
s = "hello"; //work
strcpy(s, "hello"); //segmentation fault