char *p="orkut" vs const char *p="orkut"
这两个人的区别是什么......
修改
来自bjarne stroustrup,第3版第90页
void f()
{
char* p="plato";
p[4]='e' // error: assign to const;result is undefined
}
这种错误通常不会被捕获,直到运行时间和实施在执行此规则方面有所不同
与const char * p =“plato”
相同这就是为什么我会问这种差异......这里有什么 const 的意义..
答案 0 :(得分:7)
const char*
变体是正确的。
您不应更改来自字符串文字的内存(通常称为静态存储)。它是只读存储器。
不同之处在于char*
变体将允许您编写语法以通过解除引用来更改它指向的数据。它实际上做的虽然未定义。
//Option 1:
char *p = "orkut";
*p = 'x';//undefined behavior
//Option 2:
const char *q = "orkut";
*q = 'x';//compiling error
我宁愿让选项2发生在我身上。
答案 1 :(得分:0)
const char * p的声明意味着p指向的东西是const,即不应该改变。我说不应该因为有可能抛弃常量。正如已经指出的那样,更改字符串文字是未定义的,并且经常会导致访问冲突/分段错误。
这个声明不是char * const p,这意味着p本身就是const而不是p指向的东西。
答案 2 :(得分:0)
Stroustrup在你引用的内容中讨论的问题是,在C ++中,字符串文字很容易转换为“类型的rvlaue”指向char“(4.2 / 2”数组到指针转换“)的指针。特别是将char*
指向一个文字字符串的非常常见的习惯用法不会导致bazillion程序无法编译。(特别是当C ++最初从C演变时)。
如果您可以将指针声明为char const*
(或等效的const char*
),则可以帮助您避免遇到Stroustrup引用中描述的问题。但是,使用具有非100%const正确函数的指针可能会遇到恼人的问题。
答案 3 :(得分:0)
答案 4 :(得分:0)
请注意,更新的gcc实现不会让你做到
char *foo = "foo";
他们坚持使用const(当然是in -wall -werror模式)