为什么C程序崩溃了?

Nul*_*ion -2 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';
}
Run Code Online (Sandbox Code Playgroud)

而以下代码完美地运作:

void changeChar(char *string);

int main(int argc, char *argv[])
{
  char test[] = "word";
  changeChar(test);
  return 0;
}

void changeChar(char *string) {
  *string = 'A';
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

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


Kir*_*rov 5

因为

char *test = "word";
Run Code Online (Sandbox Code Playgroud)

是不一样的

char test[] = "word";
Run Code Online (Sandbox Code Playgroud)

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

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

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


归档时间:

查看次数:

136 次

最近记录:

13 年 前