-1

このコードでエラーが発生するのはなぜですか? zbcdeを出力するべきではありませんか?

int main()
{
char *p="abcde";
*p='z';
printf("%s\n",p);
return 0;
}
4

2 に答える 2

2

文字列リテラルを変更しようとしています。それは未定義の動作です。

さらなる説明: "abcde" は a ではchar *なくconst char *. 次のいずれかの解決策を実行する必要があります。

char p[] = "abcde";

また

char *p = strdup("abcde");

(後者の場合、free() p を忘れないでください!)

于 2012-08-14T18:24:38.910 に答える
2

char *p="abcde";- これによりabcde、テキスト セグメント内の文字列が読み取り専用データとして保持され、アドレスがローカル ポインター変数に保持されますp

*p = 'z'aは、読み取り専用データをに置き換えようとしzます。これは未定義の動作であり、クラッシュにつながる可能性があります。

そのため、以下のように文字列をローカル char 配列変数として宣言します。

char p[] = "abcde"

したがって、以下のように文字列を保持するために動的メモリを割り当てます。

char *p = strdup("abcde");
...
free(p);
于 2012-08-14T18:26:18.923 に答える