回答
char* c = "Hello World!";
是一個指向文字串,其典型地存儲在一個只讀存儲器段。試圖修改它是未定義的行爲。指針字符串文字如這應該更適當地被定義爲
const char *c = "Hello World!";
但const
常被省略(在C,至少)。
@Eric:好點 - 我現在編輯了答案,使它更精確一些。 – 2013-04-04 14:36:32
char* c = "Hello World!";
這裏c
是指向一個字符串的指針,所以你不能修改它
你可以用這個來代替
char c[] = "Hello World!";
*c = 'h',
c
這裏是char類型的數組,幷包含字符串"Hello World!"
的字符,所以你可以修改它。
修改字符串文字是undefined behaviour。主要原因是編譯器允許將"Hello World!"
放置在只讀存儲器中。
在另一方面,下面是細:
char c[] = "Hello World!";
*c = 'h';
向提問者解釋他們是如何試圖修改字符串文字而不是僅僅聲明它是未定義的行爲可能是有用的。 – 2013-04-04 14:31:24
您將c
指向字符串文字,很可能存儲在只讀內存段中,您無法更改它。即使你可以物理改變,如按照C時的參數:如果程序試圖修改[字符串常量]
6.4.5(字符串)中
,該行爲是不確定的。
如果您在堆(或堆棧)上分配內存,然後將該字符串複製到該位置,則可以根據需要更改它。
字符串像char * c = "Hello";
是字符串常量和存儲在只讀數據段,所以你不能對其進行修改[但一些編譯器也允許]
堆中分配的字符串不是隻讀段,並因此免費被修改。
- 1. C++訪問衝突
- 2. C++:字符串,結構和訪問衝突寫入位置
- 3. 訪問衝突錯誤逆轉串C++
- 4. 覆蓋衝突app/controllers/static_pages_controller.rb?
- 5. 覆蓋屬性衝突
- 6. 字符指針拋出訪問衝突
- 7. 訪問衝突異常C#
- 8. C鏈表訪問衝突
- 9. C++異常訪問衝突
- 10. C#內存訪問衝突
- 11. C++訪問衝突錯誤
- 12. 指針訪問衝突? - C++
- 13. 訪問衝突錯誤C
- 14. 訪問衝突讀取C++
- 15. C++ ffmpeg訪問衝突
- 16. C++結構訪問衝突
- 17. C++訪問衝突碰撞
- 18. C++ OpenGL glTexImage2D訪問衝突
- 19. 訪問衝突幫助C++
- 20. C#WPF 0xC0000005:訪問衝突
- 21. TStringList C++ Builder訪問衝突
- 22. C++切換訪問衝突
- 23. 類訪問衝突C++
- 24. 訪問衝突
- 25. 訪問衝突
- 26. 訪問衝突
- 27. 訪問衝突?
- 28. C字符串保持相互覆蓋
- 29. 字符串覆蓋其他字符串
- 30. 覆蓋字符串屬性問題
在現代C++編譯器中,這甚至不會編譯,或者至少會發出嚴重警告。 – 2013-04-04 14:25:55
@KonradRudolph你的意思是這個'char * c =「ccxcv」';像char * const c一樣行事;'? – 2013-04-04 14:27:22
@Stephane否,作爲'char const *',「警告:從字符串文字轉換爲'char *'已棄用」。 – 2013-04-04 14:27:45