char * p =“orkut”vs const char * p =“orkut”
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的意义是什么?
const char*
变体是正确的。
您不应该更改来自字符串文字的内存(通常称为静态存储)。 它是只读存储器。
区别在于char*
变体将允许您编写语法以通过解除引用来更改它指向的数据。 它实际上做的虽然未定义。
//Option 1: char *p = "orkut"; *p = 'x';//undefined behavior //Option 2: const char *q = "orkut"; *q = 'x';//compiling error
我宁愿让选项2发生在我身上。
const char * p的声明意味着p指向的东西是const,即不应该改变。 我说不应该因为有可能抛弃常量。 正如已经指出的那样,更改字符串文字是未定义的,并且经常导致访问冲突/分段错误。
这个声明不是char * const p,这意味着p本身就是const而不是p指向的东西。
Stroustrup在你引用的内容中讨论的问题是,在C ++中,字符串文字很容易转换为“类型的rvlaue”指向char“(4.2 / 2”数组到指针的转换“)。这是特别的将char*
指向文字字符串的非常常见的习惯用法不会导致bazillion程序无法编译。(特别是当C ++最初从C演变时)。
如果您可以将指针声明为char const*
(或等效的const char*
),那么您将自己避免遇到Stroustrup引用中描述的问题。 但是,使用具有非100%const正确函数的指针可能会遇到恼人的问题。
看到这个问题 。
基本上,
char *p="orkut";
在这种情况下, p
应该是只读的,但并非所有编译器(或标准)都强制执行。
请注意,更新的gcc实现不会让你这样做
char *foo = "foo";
他们坚持使用const(当然是在-wall-flaror模式下)