为什么代码段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原谅我的无知。
答案 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是指向静态内存的指针,因此有机会说“哇,伙计,不能这样做”。
但这是一个猜测的位而不确切地知道它的作用有何不同。它也将依赖于编译器和实现。