尝试访问C中字符串上的字符时出现总线错误

时间:2010-11-08 23:47:20

标签: c linux unix libc

我多次使用这行代码(更新:当字符串是函数的参数时!),但是当我现在尝试这样做时,我得到一个总线错误(使用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指针更改字符串的第二个字符?

1 个答案:

答案 0 :(得分:9)

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

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

  

我多次使用这行代码..

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

当您声明指向字符串文字的指针时,它指向数据段中的只读内存(如果您愿意,请查看程序集输出)。将您的类型声明为char []会将该文字复制到函数的堆栈中,这样可以在需要时对其进行修改。