char* pstr[] = { "Robert Redford", // Initializing a pointer array
"Hopalong Cassidy",
"Lassie",
"Slim Pickens",
"Boris Karloff",
"Oliver Hardy"
};
如果我写得如下:
*pstr[0] = 'X';
程序可以编译但在执行此语句时崩溃。为什么?我认为* pstr [0]是'R',所以我可以从'R'变为'X'。 谢谢!
答案 0 :(得分: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"
};
答案 1 :(得分:7)
编译器应该警告过你:
warning: deprecated conversion from string constant to 'char*''
你在这里做的是为可变的char指针分配一些常量char数组,就像:
const char[] astring = "ababa";
char* mutablestring = astring; // shouldn't be possible
mutablestring[0] = 'o'; // change 'readonly' location
结果是,在运行时,指向您的二进制文件的指针,以及您正在写入的指针。但这只是内存,所以..崩溃。
答案 2 :(得分:2)
字符串文字是常量,因此您无法更改它们。
允许从const char*
转换为char*
,以便在C获得const
之前允许旧的C代码。
答案 3 :(得分:2)
pstr
是一个包含const *char
元素的数组。修改只读内存的结果是未定义的。如果您知道每个字符串的最大大小,您可以像这样声明pstr
char pstr[][32] = { "Robert Redford",
"Hopalong Cassidy",
"Lassie",
"Slim Pickens",
"Boris Karloff",
"Oliver Hardy"
};