为什么C程序崩溃了?

时间:2013-06-08 20:49:16

标签: c string pointers string-literals

请有人解释为什么以下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';
}

3 个答案:

答案 0 :(得分:5)

第一个程序崩溃,因为它试图写入分配给字符串文字的内存,这是一个未定义的行为。第二个程序将字符串文字复制到可写内存中,解决问题。

答案 1 :(得分:5)

由于

char *test = "word";

不同
char test[] = "word";

第一个是字符串文字它不能被改变 - 改变它会导致未定义的行为(因为它们是不可变的)。

第二个是char s的标准(可变)数组。

顺便说一句,第一个必须const char*,而不是char*(这甚至可以解决问题 - 你会得到编译时错误) (感谢@ouah和@dasblinkenlight - 不知道,这种情况有区别)

答案 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?