2011-05-23 86 views
2
char* pstr[] = { "Robert Redford", // Initializing a pointer array 
       "Hopalong Cassidy", 
       "Lassie", 
       "Slim Pickens", 
       "Boris Karloff", 
       "Oliver Hardy" 
       }; 

如果我寫象下面這樣:C++指針解釋

*pstr[0] = 'X'; 

該程序可以編譯,但在執行該語句時崩潰。爲什麼?我認爲* pstr [0]是'R',因此我可以從'R'更改爲'X'。 謝謝!

回答

7

編譯器應該警告你:

warning: deprecated conversion from string constant to 'char*'' 

你在做什麼這裏指定一些常量字符數組到一個可變的字符指針,很像:

const char[] astring = "ababa"; 
char* mutablestring = astring; // shouldn't be possible 
mutablestring[0] = 'o'; // change 'readonly' location 

結果是,在運行時,一個指向你的二進制文件的指針,並且你正在寫。但那只是只讀內存,所以......崩潰。

+2

從C++ 11開始,編譯器可能會將轉換視爲錯誤。 – 2011-05-23 14:11:27

7

您正在製作一個指向數組const char*的指針。所以pstr [0]指向一個const char*,你不能改變它的值。

這是一個良好的編程習慣用這種方式來編寫代碼,所以如果你試圖改變的價值,而不是運行時錯誤,你會得到一個編譯錯誤:

char* const pstr[] = { "Robert Redford", // Initializing a pointer array 
       "Hopalong Cassidy", 
       "Lassie", 
       "Slim Pickens", 
       "Boris Karloff", 
       "Oliver Hardy" 
       }; 
+0

+1爲一個很好的答案。你也可以使用'std :: string'來簡化你的工作。 – ereOn 2011-05-23 12:18:43

+0

和+1的好建議:'const'規則! – xtofl 2011-05-23 12:29:44

+1

由於歷史原因,字符串文字的類型爲char *',這就是它編譯的原因,但實際上是不可變的。 – 2011-05-23 12:34:49

2

的字符串文字是常數,所以你不能改變它們。

允許從const char*轉換爲char*只是允許從C得到const之前的舊C代碼。

2

pstr是具有const *char元素的數組。修改只讀內存的結果是未定義的。如果你知道每個字符串的最大尺寸,你可以聲明pstr像這樣

char pstr[][32] = { "Robert Redford", 
       "Hopalong Cassidy", 
       "Lassie", 
       "Slim Pickens", 
       "Boris Karloff", 
       "Oliver Hardy" 
       };