に置き換えようとして'G'
い'R'
ますが、未処理の例外が発生しています。
int main()
{
char *pszStr1 = "EFGH";
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
文字列が読み取り専用領域にあります。
代わりに、
int main()
{
static char pszStr1arr[] = "EFGH";
char *pszStr1 = pszStr1arr;
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
int main()
{
char *pszStr1 = "EFGH";
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
このコードpszStr1
には文字列リテラルがあり、const char *pszStr1 = "EFGH";
. 読み取り専用メモリ空間を変更しようとしています。
char *pszStr1 = "EFGH";
は定数であり、内容を変更すると不定になります。
コンテンツを変更したい場合は、配列を取得する必要があります。
char arr[] = "EFGH";
そして、あなたはこれを行うことができます:
arr[2] = 'R';
現代の C では文字列リテラルは const であるため、宣言char *pszStr1 = "EFGH";
が間違っていますconst char *pszStr1 = "EFGH";
。多くのオペレーティング システムでは、それらは読み取り専用としてマークされたメモリ内のセクションになり、OS はそれらに書き込むことができないように強制します。文字列リテラルをスタック (またはヒープ) 上の一時文字列にコピーすると、プログラムは機能します。
int main()
{
char str[5];
char *pszStr1=str;
strcpy(pszStr1,"EFGH");
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}