请有人解释为什么以下C程序崩溃:
void changeChar(char *string);
int main(int argc, char *argv[])
{
char *test = "word";
changeChar(test);
return 0;
}
void changeChar(char *string) {
*string = 'A';
}
虽然以下代码完美无缺:
void changeChar(char *string);
int main(int argc, char *argv[])
{
char test[] = "word";
changeChar(test);
return 0;
}
void changeChar(char *string) {
*string = 'A';
}
答案 0 :(得分:5)
第一个程序崩溃,因为它试图写入分配给字符串文字的内存,这是一个未定义的行为。第二个程序将字符串文字复制到可写内存中,解决问题。
答案 1 :(得分:5)
由于
char *test = "word";
与
不同char test[] = "word";
第一个是字符串文字它不能被改变 - 改变它会导致未定义的行为(因为它们是不可变的)。
第二个是char
s的标准(可变)数组。
顺便说一句,第一个必须是 (感谢@ouah和@dasblinkenlight - 不知道,这种情况有区别) const char*
,而不是char*
(这甚至可以解决问题 - 你会得到编译时错误)
答案 2 :(得分:2)
因为char *test = "word";
定义了一个指向驻留在只读内存中的常量字符串文字的指针。尝试修改它会导致 未定义的行为 。
另见:
What is the difference between char s[] and char *s?
由于这是一个很常见的错误,你会发现许多重复:
Why do I get a segmentation fault when writing to a string initialized with "char *s" but not "char s[]"?
C: differences between char pointer and array
Is it possible to modify a string of char in C?