我试图理解为什么以下代码是非法的:
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(使用前将#替换为@)