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" 
       };