为什么char*s=";“你好”;;允许吗?

为什么char*s=";“你好”;;允许吗?,c,pointers,C,Pointers,上面的代码在程序的只读部分(我忘记了部分的名称)分配了6个字节来存储字符串hello。然后,s被初始化为指向字符串的第一个字符hello。修改字符串“hello”是未定义的行为。此外,“hello”本身在本质上是不变的。程序没有更改只读节的权限 我正在使用MS VC++2010 Express。我的问题是,为什么编译器允许s(一个char*)指向常量字符串?难道不应该有编译器错误吗?编译器不应该强迫我们使用const char*s=“hello”而不是char*s=“hello” 谢谢。在C语言

上面的代码在程序的只读部分(我忘记了部分的名称)分配了6个字节来存储字符串
hello
。然后,
s
被初始化为指向字符串的第一个字符
hello
。修改字符串“hello”是未定义的行为。此外,
“hello”
本身在本质上是不变的。程序没有更改只读节的权限

我正在使用MS VC++2010 Express。我的问题是,为什么编译器允许
s
(一个
char*
)指向常量字符串?难道不应该有编译器错误吗?编译器不应该强迫我们使用
const char*s=“hello”而不是
char*s=“hello”


谢谢。

在C语言中,“hello”的类型是char[]
。这不是C++。参见。

这早于
const
限定词被引入C的时代。C标准机构对于现有代码非常保守。语言的任何改进都必须确保不会破坏为本标准先前版本编写的任何现有一致性规范

如果这样会导致不必要的复杂情况,那么该功能将被弃用,并可能在几年后更改

对于字符串文本被键入
char[]
而不是
char const[]
的具体特性,是的,这对于初学者来说是一个不幸的陷阱。只要从一开始就养成使用
char const*
的习惯,无论何时引用这样的字符串

编辑:对于编译器是否可以或应该对此发出警告的问题,我认为这很难跟踪。在此代码中

char *s = "hello";

gcc只在第一次分配时给我一个警告,而不是在第二次分配时。叮当声根本无法捕捉到它。

@samold我不知道你的意思。如果你的意思是我应该简单地把这个问题作为一个重复投票,那么我在这里的感觉是,这个问题已经足够不同了,尽管这里的完整答案涵盖了这个问题。无论如何,如果其他人觉得这个问题是重复的,他们可以把它作为一个问题来解决。对不起,伙计,我只是喜欢菲尔·肯·塞本。:)@哦,我明白了。这张头像是另一位StackExchange用户选择的,他的OpenID发现自己连接到了这个不情愿的共享帐户。嘘,听起来很可怕。提醒版主注意,他们过去也做过类似的事情……为了避免混淆,它有char[N]类型,其中N是文本+1的长度。他们这样做是正确的,但在上述情况下,发出警告就足够了。这并不是我要考虑的“打破旧代码”。确切地说,与字符串文字关联的数组类型是“代码> char [n] < /code >,但是修改它的任何尝试都有未定义的行为。(例如,可以告诉gcc使用
-Wwrite strings
选项将字符串文本视为常量,但这是不一致的。)@glglglgl,我完全同意,但不认为这是微不足道的。请看我的编辑。
int main(void) {
  "hello"[0] = 'H';
  char * a = "hoho";
  a[0] = 'H';
}