文章出處

  一段有問題的代碼,你能看出來么?

1 int main(){
2     char* msg="ABC";
3     msg[0]=msg[1];
4     puts(msg);
5     return 0;
6 }

  編譯這段代碼并不會有什么問題,一段運行程序就崩潰;因為這段代碼修改了內存中常量區的值

  計算機將程序載入內存時,會把所有常數放到常量存儲區,這部分內存是只讀的

  為了更改字符串的內容,需要對它的副本進行操作,就是將字符串的內容復制到非只讀區域就可以了

  那么這和之前的代碼區又什么區別呢?在原來的代碼中使用了指向只讀區域的指針,我們通過指針去修改字符串的值,而指針所對應的字符串是在只讀區域中的;而在后面的代碼,我們是用字符串字面量初始化了一個數組,就是將只讀的字符串復制到了非只讀區域,這樣對于這個副本我們就可以隨意的去修改它了

  為了避免以后再犯修改只讀區域的錯誤,我們可以在聲明指針的時候加上const關鍵字,這樣在編譯的時候程序就能避免這種錯誤

  將指針賦值字符串字面量是沒有錯的,錯的是去修改了它的值


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()