char * p =“orkut”vs const char * p =“orkut”

时间:2010-04-01 19:27:27

标签: c pointers

 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 的意义..

5 个答案:

答案 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)

请参阅this question

基本上,

char *p="orkut";

在这种情况下,p 假设是只读的,但并非所有编译器(或标准)都强制执行。

答案 4 :(得分:0)

请注意,更新的gcc实现不会让你做到

  char *foo = "foo";

他们坚持使用const(当然是in -wall -werror模式)