当试图访问字符串中的字符时出现总线错误C
问题描述:
我已经多次使用这行代码(更新:当字符串是函数的参数!),但是当我现在尝试这样做时,我得到一条总线错误(包括gcc和clang)。我正在复制最简单的代码;当试图访问字符串中的字符时出现总线错误C
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指针更改字符串的第二个字符?
答
您正试图修改只读内存(其中存储了该字符串文字)。如果需要修改该内存,则可以使用char数组。
char str[] = "This is a string";
str[0] = 'S'; /* works */
我已经使用这个代码行多次..
我当然希望不会。最好你会得到一个段错误(我说“最好”,因为试图修改只读内存是未指定的行为,在这种情况下,任何事情都可能发生,崩溃是可能发生的最好的事情)。
当你声明一个字符串文字的指针时,它指向数据段中的只读存储器(如果你喜欢的话,看一下汇编输出)。将您的类型声明为char []将会将该文字复制到函数的堆栈中,如果需要的话,这又可以修改它。
gcc有选项'-Wwrite-strings',它会通过使它们成为'const char []'来警告你改变文字字符串。请注意,标准中的字符串实际上是'char []'(“'只读char []'”,而不是'const')并且使它们成为'const'会使得您的编译器(更多)不符合标准。 – pmg 2010-11-09 00:00:10