char s[] = "abc";
char t[3] = "abc";
实际上是完全相同的:
char s[] = { 'a', 'b', 'c', '\0' };
char t[] = { 'a', 'b', 'c' };
以下内容如下:
char *word = "abc";
word[0] = 'd';
将word
放入只读内存中,导致非法的内存操作word[0] = 'd'
出错。
这仅针对char
类型吗?当我执行类似以下内容时,没有出错:
int array[] = {1, 2, 3};
int *p = array;
p[0] = 0; // No error here
array[1] = 1; // or here
t[3] = "abc"
应该是char t[3] = "abc";
同样地,在你的第二段代码中也是如此。 - Keith Thompsonword
本身是一个可修改的变量;它可以被赋予一个新的指针值。当你使用char *word = "abc";
时,你让它指向一个字符字面量,这被视为一个字符数组。试图修改一个字符串字面量会导致未定义的行为。该字符串不一定在只读内存中(尽管现在通常是这样)。尝试将"abc"
修改为"dbc"
可能会成功,并且可能同时修改一个字符串字面量"xyzabc"
为"xyzdbc"
- 或者可能失败并导致程序崩溃。你应该使用const char *word = "abc";
。 - Jonathan Lefflerchar *word = "abc";
使word
"指向一个字符文字,被视为一个字符数组。" 然而,字符数组很容易被修改。使用以上代码,我可以毫无问题地说s[0] = 'b'
。你能否请澄清一下? - Alex Walczak