このコードでエラーが発生するのはなぜですか? zbcdeを出力するべきではありませんか?
int main()
{
char *p="abcde";
*p='z';
printf("%s\n",p);
return 0;
}
文字列リテラルを変更しようとしています。それは未定義の動作です。
さらなる説明: "abcde" は a ではchar *
なくconst char *
. 次のいずれかの解決策を実行する必要があります。
char p[] = "abcde";
また
char *p = strdup("abcde");
(後者の場合、free() p を忘れないでください!)
char *p="abcde";
- これによりabcde
、テキスト セグメント内の文字列が読み取り専用データとして保持され、アドレスがローカル ポインター変数に保持されますp
。
*p = 'z'
a
は、読み取り専用データをに置き換えようとしz
ます。これは未定義の動作であり、クラッシュにつながる可能性があります。
そのため、以下のように文字列をローカル char 配列変数として宣言します。
char p[] = "abcde"
したがって、以下のように文字列を保持するために動的メモリを割り当てます。
char *p = strdup("abcde");
...
free(p);