改变c字符串中的一个字符

2023-11-26

我试图理解为什么以下代码是非法的:

int main ()
{
    char *c = "hello";
    c[3] = 'g'; // segmentation fault here
    return 0;
}

当编译器遇到char *c = "hello";?

据我理解,它是一个自动的字符数组,并且c是指向第一个字符的指针。如果是这样,c[3]就好像*(c + 3)我应该能够完成任务。

只是想了解编译器的工作方式。


字符串常量是不可变的。您无法更改它们,即使您将它们分配给char *(因此将它们分配给const char *所以你不会忘记)。

更详细地说,您的代码大致相当于:

int main() {
  static const char ___internal_string[] = "hello";
  char *c = (char *)___internal_string;
  c[3] = 'g';
  return 0;
}

This ___internal_string通常分配给只读数据段 - 任何更改其中数据的尝试都会导致崩溃(严格来说,也可能发生其他结果 - 这是“未定义行为”的示例)。然而,由于历史原因,编译器允许您分配给char *,给您一种可以修改它的错误印象。

请注意,如果您这样做,它会起作用:

char c[] = "hello";
c[3] = 'g'; // ok

这是因为我们正在初始化一个非常量字符数组。尽管语法看起来相似,但编译器对其的处理方式有所不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

改变c字符串中的一个字符 的相关文章

随机推荐