用指针引用字符串

时间:2010-12-24 00:35:34

标签: c++ string literals access-violation const-cast

  

可能重复:
  Why does simple C code receive segmentation fault?

为什么代码段2的行为不像代码段1?

//Code snippet 1
char pstr[] = "helloworld";
char *p = pstr; 
p[2] = 'd';

//Code snippet 2
char *p = "helloworld";
p[2] = 'd'; //error: access violation

P.S原谅我的无知。

4 个答案:

答案 0 :(得分:3)

第一个片段创建一个char数组,并将其内容初始化为“helloworld”。然后你改变它的第三个元素。

第二个只是创建一个指向char的指针,指向字符串文字。然后,您尝试更改该文字的第三个字符。字符串文字在许多现代编译器生成的代码中是不可写的。

编辑:

GCC曾经有一个-fwritable-strings选项,可以使字符串文字可写,因为遗留代码依赖于此行为。该选项已在GCC 4.0 release series中删除。

答案 1 :(得分:2)

"helloworld"const char的数组。类型系统中有一个漏洞,允许您使用char*指向它,因为存在大量使用char *指向只读数据的代码,这是安全的。

const_cast规则适用,即使您使用非常量指针,也无法实际写入const数据。

答案 2 :(得分:0)

如果你能告诉我们他们的表现方式不同,那将会有所帮助。

但是作为猜测,我认为你的问题是第二种形式的'p'指向只读内存中的字符串。尝试通过指针'p'进行写操作会导致程序失败。

我可以告诉你,Gnu c ++编译器会警告你这件事。

答案 3 :(得分:0)

我猜你什么时候说“不表现得像”你的意思是抛出非法访问异常(或类似的东西),而另一个则发出编译时警告或错误?

答案是,在第一种情况下,您正在创建指向您自己的内存的指针,并将c9ontents复制到其中。此时,编译器忘记它曾经是一个指向静态内存的指针;但是,运行时系统不会忘记。

在另一种情况下,编译器“知道”p是指向静态内存的指针,因此有机会说“哇,伙计,不能这样做”。

但这是一个猜测的而不确切地知道它的作用有何不同。它也将依赖于编译器和实现。

相关问题