char *s = "hello";
上面的代码在程序的只读部分分配6个字节(我忘记了部分的名称)来存储字符串hello
。然后,s
被初始化为指向字符串hello
的第一个字符。修改字符串"hello"
是未定义的行为。此外,"hello"
本身在本质上是不变的。该程序无权更改只读部分。
我正在使用MS VC ++ 2010 Express。我的问题是,为什么编译器允许s
({1}}指向常量字符串?不应该有编译器错误?编译器不应该强迫我们使用char *
而不是const char *s = "hello";
吗?
感谢。
答案 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根本没有抓住它。