在編寫一個簡單的函數以從字符串中刪除特定字符的過程中,我遇到了一個奇怪的問題:void str_remove_chars( char *str, char to_remove){ if(str && to_remove) { char *ptr = str; char *cur = str; while(*ptr != '\0') { if(*ptr != to_remove) { if(ptr != cur) { cur[0] = ptr[0]; } cur++; } ptr++; } cur[0] = '\0'; }}int main(){ setbuf(stdout, NULL); { char test[] = "string test"; // stack allocation? printf("Test: %s\n", test); str_remove_chars(test, ' '); // works printf("After: %s\n",test); } { char *test = "string test"; // non-writable? printf("Test: %s\n", test); str_remove_chars(test, ' '); // crash!! printf("After: %s\n",test); } return 0;}我不明白為什么第二項測試失敗了?對我來說,它看起來像第一表示char *ptr = "string";相當于這一個:char ptr[] = "string";。是不是這樣
3 回答

慕工程0101907
TA貢獻1887條經驗 獲得超5個贊
嚴格說來,聲明char *ptr只能保證您指向字符類型。字符串形成已編譯應用程序的代碼段的一部分并不少見,該代碼段將被某些操作系統設置為只讀。問題在于,實際上您從未自己為該字符串顯式創建內存時,您就對預定義字符串的性質(它是可寫的)進行了假設。編譯器和操作系統的某些實現可能允許您執行嘗試做的事情。
另一方面char test[],在這種情況下,根據定義,聲明實際上為堆棧上的整個字符數組分配了可讀寫的內存。
添加回答
舉報
0/150
提交
取消