更改指针指向的字符值

时间:2016-11-15 01:51:37

标签: c string-literals

我想知道为什么我的代码在运行时会给我错误。

我正在尝试更改指针变量指向的字符值。

#include <stdio.h>

int main() {
  char amessage[] = "foo";
  char *pmessage = "foo";

  // try 1
  amessage[0] = 'o'; // change the first character to '0'
  printf("%s\n", amessage);

  // try 2
  *pmessage = 'o'; // This one does not work
  printf("%s\n", pmessage);
}

第一次尝试有效,并打印ooo。但第二个给了我:

[1]    9677 bus error  ./a.out

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

在本声明中

*pmessage = 'o';

您正在尝试更改字符串文字"foo",因为指针定义为

char *pmessage = "foo";

字符串文字在C和C ++中是不可变的。任何更改字符串文字的尝试都会导致未定义的行为。

来自C标准(6.4.5字符串文字)

  

7未指明这些阵列是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。