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

时间:2011-11-18 08:24:25

标签: c pointers

char *s = "hello";

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

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

感谢。

2 个答案:

答案 0 :(得分:5)

在C中,“hello”具有类型char[]。这不是C ++。请参阅this question

答案 1 :(得分:2)

这比const限定符引入C的时间早.C标准体对现有代码非常保守。语言的任何改进都必须以这样的方式完成,即它不会破坏为该标准的先前版本编写的任何现有符合代码。

如果这样的事情导致了不良后果,那么该功能将被弃用,并且可能在此之后的几年内发生了变化。

对于字符串文字的具体特征是键入char[]而不是char const[],是的,这对于初学者来说不幸是一个陷阱。只要你引用这些字符串,就从一开始就习惯使用char const*

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

int main(void) {
  "hello"[0] = 'H';
  char * a = "hoho";
  a[0] = 'H';
}
gcc只给我一个关于第一次分配的警告,而不是第二次。 clang根本没有抓住它。