2013-04-04 50 views
0

時,我有些納悶,爲什麼下面炸燬:訪問衝突覆蓋C字符串

char* c = "Hello World!"; 
*c = 'h'; 

當我分配在它的工作堆的字符串。所以我只是好奇我的初始版本有什麼問題。

+0

在現代C++編譯器中,這甚至不會編譯,或者至少會發出嚴重警告。 – 2013-04-04 14:25:55

+0

@KonradRudolph你的意思是這個'char * c =「ccxcv」';像char * const c一樣行事;'? – 2013-04-04 14:27:22

+0

@Stephane否,作爲'char const *',「警告:從字符串文字轉換爲'char *'已棄用」。 – 2013-04-04 14:27:45

回答

6
char* c = "Hello World!";

是一個指向文字串,其典型地存儲在一個只讀存儲器段。試圖修改它是未定義的行爲。指針字符串文字如這應該更適當地被定義爲

const char *c = "Hello World!"; 

const常被省略(在C,至少)。

+0

@Eric:好點 - 我現在編輯了答案,使它更精確一些。 – 2013-04-04 14:36:32

3
char* c = "Hello World!"; 

這裏c是指向一個字符串的指針,所以你不能修改它

你可以用這個來代替

char c[] = "Hello World!"; 
*c = 'h', 

c這裏是char類型的數組,幷包含字符串"Hello World!"的字符,所以你可以修改它。

2

修改字符串文字是undefined behaviour。主要原因是編譯器允許將"Hello World!"放置在只讀存儲器中。

在另一方面,下面是細:

char c[] = "Hello World!"; 
*c = 'h'; 
+0

向提問者解釋他們是如何試圖修改字符串文字而不是僅僅聲明它是未定義的行爲可能是有用的。 – 2013-04-04 14:31:24

3

您將c指向字符串文字,很可能存儲在只讀內存段中,您無法更改它。即使你可以物理改變,如按照C時的參數:如果程序試圖修改[字符串常量]

6.4.5(字符串)中

,該行爲是不確定的。

如果您在堆(或堆棧)上分配內存,然後將該字符串複製到該位置,則可以根據需要更改它。

-1

字符串像char * c = "Hello";是字符串常量和存儲在只讀數據段,所以你不能對其進行修改[但一些編譯器也允許]

堆中分配的字符串不是隻讀段,並因此免費被修改。

+0

我沒有投票,但你的回答是錯誤的。因爲'char * p;'指針可能指向一個char數組'char arr [30];'更新uor答案,否則可能會導致更多的downvoted – MOHAMED 2013-04-04 14:40:22

+0

謝謝@Mohamed。我希望那些downvote的人也會添加這個原因 – 2013-04-04 14:42:37

+0

這是我第一次知道有一些編譯器允許,請你提供一些參考文獻 – MOHAMED 2013-04-04 15:23:33