我試圖用'R'
替換'G'
但我得到未處理的異常。替換字符串中的字符
int main()
{
char *pszStr1 = "EFGH";
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
我試圖用'R'
替換'G'
但我得到未處理的異常。替換字符串中的字符
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";
是一個字符串,但在這裏它是像你這樣寫道:const char* pszStr1 = "EFGH";
您試圖修改只讀存儲器空間...
char pszStr1[] = "EFGH";
:
你可以通過改變它變成簡單的解決這個問題
char * pszStr1 =「EFGH」;
保存在可執行文件的只讀部分。編譯器內部分配字符串「EFGH」,然後使pszStr1指向它。所以,你不能改變它。使用數組,而不是字符指針,象下面這樣:
char pszStr1[] = "EFGG";
char *pszStr1 = "EFGH";
是一個常數,它是不確定的,如果你改變的內容。
如果你想改變的內容,你必須採取一個數組:
char arr[] = "EFGH";
,你能夠做到這一點:
arr[2] = 'R';
字符串位於現代的C常量,所以聲明char *pszStr1 = "EFGH";
是錯誤的,應該是const char *pszStr1 = "EFGH";
。在許多操作系統中,它們最終會被標記爲只讀的內存中的一部分,操作系統強制您無法寫入它們。如果將字符串文字複製到堆棧(或堆)上的臨時字符串,則該程序起作用。
int main()
{
char str[5];
char *pszStr1=str;
strcpy(pszStr1,"EFGH");
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
是否有你在這裏使用'static'的原因? –
你的上面的代碼工作正常。我的想法是隻讀,但如果用(pszStr1)替換(++ pszStr1)[1],它只會用'R'替換整個字符串。在這種情況下,只讀 – debugger
@debugger的想法沒有關鍵的是,如果你聲明爲'char * pszStr1 =「EFGH」;'然後'pszStr1'是指向常量字符串的指針而假設如果你聲明它爲'char pszStr1 [] =「EFGH」;'然後'pszStr1'是一個可以修改的數組。注意在Glglgl的代碼中'pszStr1'指向一個數組注意到聲明'char * pszStr1 = pszStr1arr;' –