【问题标题】:Why can't I edit a char in a char*?为什么我不能在 char* 中编辑 char?
【发布时间】:2011-09-20 05:37:53
【问题描述】:

下面是一个非常简单的例子。它在 Mac OS X (Snow Leopard) 上使用 gcc 编译得很好。在运行时它会输出 Bus error: 10. 这是怎么回事?

char* a = "abc";
a[0] = 'c';

【问题讨论】:

  • 这是一个字符串文字,您无法修改它,因为您的指针指向代码文本部分中的只读位置。使用char a[] = "abc" 作为创建填充字符串的字符数组的简写。

标签: c gcc c-strings


【解决方案1】:

您的代码将a 设置为指向"abc" 的指针,这是无法修改的文字数据。当您的代码违反此限制并尝试修改该值时,会发生总线错误。

试试这个:

char a[] = "abc";
a[0] = 'c';

这会创建一个 char 数组(在您程序的正常数据空间中),并将字符串文字的内容 复制 到您的数组中。 现在您应该可以毫无问题地对其进行更改。

【讨论】:

  • 那么如何声明一个“modifiable-varlength-string”数组呢?
【解决方案2】:

您正在尝试修改字符串常量。改用这个:

char a[] = "abc";
a[0] = 'c';

【讨论】:

  • 所以使用 char* 等同于声明 const char*,除了编译器没有警告你?相反,您会得到一个令人愉快的运行时错误。如果是这样,我看到了添加 const 关键字的用处。
  • 如果你用 -Wwrite-strings 编译它会警告你,很遗憾 -Wall 没有启用它
【解决方案3】:

这个

char* a = "abc";

依赖于从const char[](字符串文字的类型)到char* 的危险隐式转换。 (在 C++ 中,这种转换已被弃用十多年。不过,我不了解 C。)

不得更改字符串文字。

【讨论】:

    【解决方案4】:

    char *str = "string"; 在这种情况下,它被视为只读文字。类似于写const char *str = "string"。也就是说str指针指向的值是一个常数。尝试编辑会导致 BUS ERROR。

    【讨论】:

      【解决方案5】:

      char *a = "abc" 是一个常量字符串,存储在 ELF 二进制文件的 .data 部分中。您不允许修改此内存,如果您这样做,在某些情况下会发生未定义的行为,它不会给出错误但不会修改内存,因为您正在尝试访问通常无法访问的内存(例如写作目的)。

      【讨论】:

      • 其实"abc"是常量字符串,char *a是一个(非const)指针的初始化,该指针的第一个字符的地址。
      • @sbi 是的,这就是我的意思,应该用不同的措辞
      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      相关资源
      最近更新 更多