一段有問題的代碼,你能看出來麼?
1 int main(){ 2 char* msg="ABC"; 3 msg[0]=msg[1]; 4 puts(msg); 5 return 0; 6 }
編譯這段代碼並不會有什麼問題,一段運行程序就崩潰;因為這段代碼修改了內存中常量區的值
計算機將程序載入內存時,會把所有常數放到常量存儲區,這部分內存是只讀的
為了更改字符串的內容,需要對它的副本進行操作,就是將字符串的內容復制到非只讀區域就可以了
那麼這和之前的代碼區又什麼區別呢?在原來的代碼中使用了指向只讀區域的指針,我們通過指針去修改字符串的值,而指針所對應的字符串是在只讀區域中的;而在後面的代碼,我們是用字符串字面量初始化了一個數組,就是將只讀的字符串復制到了非只讀區域,這樣對於這個副本我們就可以隨意的去修改它了
為了避免以後再犯修改只讀區域的錯誤,我們可以在聲明指針的時候加上const關鍵字,這樣在編譯的時候程序就能避免這種錯誤
將指針賦值字符串字面量是沒有錯的,錯的是去修改了它的值