一個常量字符串的問題!

char *s = "abcde";
s[0] = '1';//此句在運行時出錯 

如下是可以的:

char s[] = "abcde";
s[0] = '1';

  

因爲:

字符串常量是不能改的,編譯後是放到只讀內存中的;

char[]和char*在很多地方可以通用,但是有個微妙的關係,那就是頭指針相同;

因爲“通過指針修改字符串常量的行爲”是未定義的,上次就有個人問"爲什麼上述代碼在TC下不報錯而在VC6.0下報錯"。不過,現在大多實現把常量字符串的存儲空間設置爲read-only,所以運行時報錯;

char *s = "abcde";相當於const char *s = "abcde";

------------------------------------------------
按照樓上各位的說法,編譯器應該禁止這麼聲明:
char *s = "abcde";
而強制我們如下聲明:
const char *s = "abcde";
爲什麼編譯器沒有這麼做呢?
--------------------------------------------
沒錯,的確因該像樓主說的那樣,編譯器應該禁止這種行爲,進而幫助程序員寫出正確的程序。
但是,這是一個特殊情況,是一個特例!
爲什麼這麼說呢?因爲char *s = "abcde";這種模式已經被很多人所使用(也包括樓主),它被使用的如此廣泛以至於標準給它一些寬容:允許這樣的代碼通過編譯。

------------------------------------------------

《effective c++》91頁註釋1:
-----------------------------------------------------------------------------
在C++ standard中,"Hello"的型別是const char[];這個型別幾乎總是被視爲const char*。因此我們預期,以一個字符串子面常量(string literal,例如"hello")作爲一個char*變量的初值,會違反常量性。但是此種行爲在C語言中實在太過頻繁,所以C++ standard對於這樣的初始化動作特別給與豁免。儘管如此,你還是應該避免這麼做,因爲那畢竟不被大家認同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章