<span style="font-size:14px">#include <iostream> #include <cstring> using namespace std ; int replacefun(char* str, char c1, char c2); int main(void) { char * p = "I love you China, do you love me?"; // 用指針的形式定義一個字符數組 int m = 0; m = replacefun(p, 'o', 'c'); cout << m << endl; return 0; } int replacefun(char* str, char c1, char c2) { int num = 0; while (*str != '\0') { if (*str == c1) { *str = c2; // 這句話調試的時候內存報錯 num++; } str++; } return num; } </span>
這個程序實現的目的的是替換指定的字符,在編譯的時候沒有任何錯誤,但是在運行的時候,程序意外終止。 於是,啟動利器,單步調試。。。跳進函數後,發現在*str到達'o'之前一切正常,不過。。到了'o'之後,結果說內存錯誤,無法賦值。 經過多方查找資料和詢問,得知: char *p="abcde";的時候,字符串是不可以修改的! 而char p[]="abcde";的時候,字符串是可以修改的! 同一個字符串,用指針定義的時候在常量區,而用數組定義的時候在棧中。 就是剛剛上面的那個 I love you China, do you love me? 是一個常量。 據大嬸說: "I love you China, do you love me?" 在存放在.rodata段,該段是只讀的,當你強行做修改的時候,當然要報錯喽。 而定義為數組的形式之後:就把這個字符串拷貝進數組了,對於數組中的內容,可以隨便修改呀. 原來的字符串還是不變的。。。 以上總結,漲姿勢了。 繼續C++。