【问题标题】:bus error when trying to access character on a string in C尝试访问 C 中字符串上的字符时出现总线错误
【发布时间】:2010-11-08 23:47:19
【问题描述】:

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

【问题讨论】:

  • gcc 有-Wwrite-strings 选项,它会警告您更改文字字符串,将它们设为const char[]。请注意,标准说文字字符串是char [](实际上是“read only char []”,但不是const),并且使它们成为const 会使您的编译器(更多)不符合要求。

标签: c linux unix libc


【解决方案1】:

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

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

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

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

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

【讨论】:

  • +1。尝试修改字符串文字是未定义的行为。它可能看起来有效,但当然不能保证。
  • “充其量你会得到一个段错误” - 实际上,这并不完全正确。未定义的行为是未定义的,有时这意味着它可以按预期工作:-) 有很多没有内存保护的嵌入式芯片。并不是说你的 answer 是错误的,因为这个问题被标记为 linux(所以 +1),只是这一点在所有情况下都不一定正确。
  • @paxdiablo:因此“充其量”部分 =)
  • 也就是说,你很幸运能遇到段错误。
  • 段错误是最好的结果。最坏的情况是它默默地“工作”并更改程序中其他地方的常量字符串的值,该字符串恰好具有相同的内容,因此共享相同的存储空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多