問題是你正試圖修改一個字符串文字。這樣做會導致程序的行爲未定義。
說你不允許修改字符串文字是過分簡化。說字符串文字是const
是不正確的;他們不是。
警告:請注意以下事項。
字符串文字"this is a test"
是char[15]
類型的表達式(長度14,加上終止'\0'
的1)。在大多數情況下,包括這一個,這樣的表達式被隱含地轉換爲指向數組的第一個元素的指針,類型爲char*
。
試圖修改字符串引用的數組的行爲是未定義的 - 不是因爲它是const
(不是),而是因爲C標準明確指出它未定義。
一些編譯器可能允許你擺脫這一點。你的代碼實際上可能會修改與文字相對應的靜態數組(這可能會在以後造成很大的混淆)。
大多數現代編譯器,不過,將存儲在只讀存儲器陣列 - 不是物理的ROM,但在那個年代由虛擬內存系統免受修改的內存區域。試圖修改這種內存的結果通常是分段錯誤和程序崩潰。
那麼爲什麼不是字符串文字const
?因爲你真的不應該試圖修改它們,所以它肯定是有意義的 - 而且C++確實會生成字符串文字const
。原因是歷史的。它是由1989年的ANSI C標準出臺之前,const
關鍵字不存在(雖然它由一些編譯器之前,可能實現)。所以ANSI前的程序可能是這樣的:
#include <stdio.h>
print_string(s)
char *s;
{
printf("%s\n", s);
}
main()
{
print_string("Hello, world");
}
有沒有辦法來強制執行print_string
不允許修改字符串由s
指出這樣的事實。 ANSI C中的字符串文字const
將破壞現有的代碼,ANSI C委員會非常努力地避免這樣做。自那時以來,沒有一個很好的機會對語言做出這樣的改變。 (C++的設計者,主要是Bjarne Stroustrup,並不擔心向後兼容C.)
多德 - 「這是一個測試」是一個字符串文字。這意味着它是* READ ONLY *「字符數組」。您甚至可能試圖修改它,而不會在某些平臺上崩潰。但它絕對是一個禁忌的* ANY *平臺:) – paulsm4