【发布时间】:2013-03-20 05:19:21
【问题描述】:
我明白了
char *s = "Hello World!" ;
存储在只读内存中,字符串文字不能通过指针修改。
这和
有什么不同const char *s = "Hello World!";
'string' char * 或 const char * 的类型也是?
【问题讨论】:
-
第一种方式已弃用且危险。
我明白了
char *s = "Hello World!" ;
存储在只读内存中,字符串文字不能通过指针修改。
这和
有什么不同const char *s = "Hello World!";
'string' char * 或 const char * 的类型也是?
【问题讨论】:
通过将类型指定为const char *,它会更难意外覆盖内存,因为如果您尝试编译器会出错:
const char *s = "Hello World!";
s[0] = 'X'; // compile error
如果你不使用const,那么问题可能要到运行时才被发现,或者它可能只是导致你的程序出现细微的错误。
【讨论】:
区别在于后者是合法的,而前者是不合法的。这是在 C++11 中所做的更改。形式上,"Hello World!" 的类型为 const char[13];它可以转换为const char*。在过去,它的类型可能是char[13],可以转换为char*。 C++ 通过添加const 更改了数组的类型,但保留了对char* 的转换,以便使用char* 的现有C 代码可以在C++ 中工作,但修改指针指向的文本会产生未定义的行为。 C++11去掉了对char*的转换,所以现在只能合法做
const char *s = "Hello world!";
【讨论】:
C++11 removed the conversion to char* -- 不在 gcc48 中。这是 gcc 错误吗?
const会改变类型,const<char*>或const<char[]>不是更符合逻辑吗?