6

我已经多次使用这行代码(更新:当字符串是函数的参数时!),但是当我现在尝试这样做时,我得到了一个总线错误(包括 gcc 和 clang)。我正在复制最简单的代码;

char *string = "this is a string";
char *p = string;
p++;
*p='x'; //this line will cause the Bus error
printf("string is %s\n",string);

为什么我无法使用 p 指针更改字符串的第二个字符?

4

1 回答 1

15

您正在尝试修改只读内存(存储该字符串文字的位置)。如果您需要修改该内存,则可以使用 char 数组。

char str[] = "This is a string";
str[0] = 'S'; /* works */

这行代码我用过很多次了。。

我当然希望不会。充其量你会得到一个段错误(我说“充其量”是因为尝试修改只读内存是未指定的行为,在这种情况下任何事情都可能发生,并且崩溃是可能发生的最好的事情)。

当您声明一个指向字符串文字的指针时,它指向数据段中的只读内存(如果您愿意,请查看汇编输出)。将您的类型声明为 char[] 会将文字复制到函数的堆栈中,这反过来又允许在需要时对其进行修改。

于 2010-11-08T23:50:51.263 回答