-2

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

3 回答 3

5

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

于 2013-06-08T20:51:06.220 回答
5

因为

char *test = "word";

不一样

char test[] = "word";

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

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

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

于 2013-06-08T20:51:33.657 回答
2

因为char *test = "word";定义了一个指向位于只读内存中的常量字符串文字的指针。试图修改它会导致未定义的行为

另请看:
char s[] 和 char *s 有什么区别?

由于这是很常见的错误,您会发现许多重复项:
为什么在写入使用“char *s”而不是“char s[]”初始化的字符串时会出现分段错误?
C: char 指针和数组的区别
是否可以在 C 中修改一个 char 字符串?

于 2013-06-08T20:51:13.753 回答