在xp平台使用vc++6.0編譯執行如下**:
1char *s="
aaa"
;2 printf("
%s\n
",s);
編譯執行一切正常,但如果在加入一些**,例如:
1char *s="
aaa"
;2 printf("
%s\n
",s);
3 s[0]='b'
;4 printf("
%s\n
",s);
編譯通過,但執行過程中輸出「aaa」之後,系統彈出「帶除錯的傳送錯誤報告」對話方塊,問題表現出來啦。
這其實是乙個概念性的問題,aaa是字串常量,為了對它進行操作,定義了乙個指標char *s,但是,s是乙個普通的指向char型「變數」的指標,用乙個指向變數的指標指向常量,自然會留下隱患。例如像**中那樣對s[0]進行賦值,編譯器不會發現這個錯誤,但是,只有變數的值才是可以修改的(常量無法被賦值,也無法被修改),這個動作的意圖是通過指標s來修改乙個常量的值,於是,執行的時候錯誤發生了。
解決這個問題的辦法就是從「aaa」最本質的歸屬出發,需明確告訴編譯器,指標指向的型別是常量,不可修改,於是:
1const
char *s="
aaa"
;2 printf("
%s\n
",s);
這樣,如果再有對「aaa」有寫的動作,編譯器就會提示錯誤,減少後期bug的出現,這也是const的乙個重要用法。
這是乙個入門的問題,也是乙個隱蔽性很高的問題,在此列出,以示警醒。
2013-05-01
其它延伸:
const指標的性質:假設有
int *p const = &a;
那麼,可以改變p所指向的值,但不能改變p儲存的位址。
const修飾指標與修飾常量
1.const 修飾指標 常量指標 eg const int p a 特點 指標的指向可以修改,但是指標指向的值不能修改 int a 10 int b 20 int p a p 20 錯誤 p b 正確 2.const 修飾常量 指標常量 eg int const p a 特點 指標的指向不能修改,...
const常量 指向常量的指標和常量指標
1 先看const常量的情況 const int a 2 int const b c c是已經宣告過的整型 兩者都可以。本地的const常量必須在第一次宣告時就初始化,用變數或常量初始化都可以,只是初始化一次以後它的值就不能再改變了,此所謂const的含義。2 接著看指向常量的指標 const in...
const修飾指標的用法 常量指標和指標常量
const通常用來修飾變數不能夠更改值,多用來保護變數或引數。const int b 100 b 0 錯誤 當const修飾指標時,由於const的位置不同,它的修飾物件會有所不同。如下 int const p2中const修飾p2的值,所以理解為p2的值不可以改變,即p2只能指向固定的乙個變數位址...