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模式下)