2012-03-07 53 views
0
char* p ="good"; 
p[2] = 'a'; 

我的理解是存儲在只讀存儲器中。所以它不能被修改。 但在Visual Studio 8中,它沒有提供任何錯誤。任何人都可以解釋這裏發生了什麼。字符串常量的修改

+0

此問題已被詢問*許多*,*許多*次。我們如何讓它停止? – 2012-03-07 07:25:13

+0

@Carl Norum,你知道答案嗎? – user966379 2012-03-07 07:31:09

回答

0

既然你宣佈p作爲char *,而不是const char *,你是「允許」的內容從視圖和崩潰在運行時編譯器的角度改變p點,但你應該得到至少一個警告分配一個字符串常量到char *

換句話說,這就是問題所在:

char* p ="good"; 

,但你會崩潰的位置:

p[2] = 'a'; 
+0

但是p [2] ='a';在這裏沒有崩潰 – user966379 2012-03-07 07:26:16

+0

未定義的行爲是* undefined *。它可能會崩潰,它可能不會。它可能會刪除計算機上每個帶有7個字符名稱的文件。 – 2012-03-07 16:04:42

1

UB不需要在報告問題的意識,「給一個錯誤」給程序員或用戶。僅調用UB 是一個錯誤,您必須意識到這一點,而不是這樣做。

3

你在做什麼是未定義的行爲。這意味着你不能猜測會發生什麼,因爲它將取決於編譯器,操作系統,星期幾和月相。

在某些情況下,您會看到它「工作」,就好像您被允許寫入一樣,在其他情況下您可能會崩潰......在其他情況下,您可以進行該更改以突變字符串和其他字符串(例如來自程序另一部分的包含"hmmm... this is good"的字符串文字)。

在C語言和C++中,當你犯了一個錯誤時,你不能指望系統能夠幫助你......假設就是你不會犯錯誤。所以不要那樣做。

有沒有運行時錯誤天使來幫助你在這些語言,只是未定義的行爲守護進程等着你讓你哭泣的樂趣。