写入位置发生冲突,该如何解决
写入位置发生冲突在c++ Primer 上摘下来的一段程序,编译,链接都没有问题,运行时调试发现出现了写入位置冲
写入位置发生冲突
在c++ Primer 上摘下来的一段程序,编译,链接都没有问题,运行时调试发现出现了写入位置冲突的错误。
C/C++ code#include<iostream>using namespace std;void main(){ char* p="Iloveyou!"; cout<<*p<<endl; *p='P'; cout<<p<<endl;}
只是想通过*p='P'; 将"Iloveyou!" 改成"Ploveyou!",运行时的错误信息为:
theme93.exe 中的 0x00436767 处未处理的异常: 0xC0000005: 写入位置 0x0049f090 时发生访问冲突
Google 了一下,发现可能是非法指针的问题,但还是不明白根本原因在哪? 哪位可以给我一个比较详细的解释?
谢谢!
[解决办法]char* p="Iloveyou!";
p是一个指针,指向字符串在常量区,不能修改。
char p[]="Iloveyou!";
p是一个数组,可以修改。
[解决办法]p是个指向常量的指针了,你不能改它指向的值的
[解决办法]thinking in c++说char* p="Iloveyou!"; 是技术错误,只是编译器接受
[解决办法][解决办法]顶!
[解决办法]这个问题讨论好多次了。
看看Thingking in C++的作者Bruce是怎么说的:
限定词const是很严格的,没有强调const的地方时字符数组的字面值。也许有人可以写:
char* cp="howdy";
编译器将接受它而不报告错误。从技术上讲这是一个错误,因为字符数组的字面值(这里是"howdy")是被
编译器作为一个常量字符数组建立的,所引用该字符数组得到的结果是它在内存里得首地址。
修改该字符数组的任何字符数组里的任何字符都会导致运行时错误,当然,并不是所有编译器
都会做到这一点。
所以字符数组的字面值实际上是常量字符数组,当然编译器把它们作为非常量看待,
这是因为有许多现有的C代码是这样做的。当然,改变字符数组的字面值的做法还未被定义,
虽然可能在很多机器上时这样做的。
如果想修改字符串,就要将它放到一个数组中:
char cp[]="howdy"