主题:请大侠帮忙看下,为啥出错
cook_
[专家分:0] 发布于 2011-05-14 22:32:00
1--int main()
2--{
3-- char* const cp = "xyz";
4-- *cp = 'a';
5-- return 0;
6--}
在debug模式下,调试到第四行的时候会出现“File.exe 中的 0x004114d8 处未处理的异常: 0xC0000005: 写入位置 0x00416800 时发生访问冲突”错误,怎么回事呢,给个详细的解释吧,拜谢
回复列表 (共9个回复)
沙发
Pony279 [专家分:10] 发布于 2011-05-14 23:04:00
我复制过来执行,没出错呀。。。
板凳
cook_ [专家分:0] 发布于 2011-05-14 23:11:00
我说的事debug模式下,你在第四行设置个断点啊,调试下,就看到了
3 楼
Pony279 [专家分:10] 发布于 2011-05-14 23:16:00
刚才是用realese模式执行的,所以没出错,呵呵,不好意思
这个应该是因为字符串 "xyz" 本身是常量(文字常量,记得好像是这样叫的)
4 楼
windy0will [专家分:2300] 发布于 2011-05-14 23:26:00
其实代码中有一个错误,
cp只是一个指针,而它指向一个字符串常量。编译器一般会把所有的字符串常量放到只读空间里面,不能写。而楼主您下面那句赋值语句明显要写cp所指向的空间,而它的属性是不能写,故出现了访问违例。
5 楼
Pony279 [专家分:10] 发布于 2011-05-14 23:31:00
不知道你学了数组和动态内存分配没有,如果你想要让它可以修改的话可以这样写:
#include <iostream>
using namespace std;
int main()
{
int n = 10;
char* const cp = new char[n];
strcpy_s(cp, 3 + 1, "xyz");
cout<<cp<<endl;
strcpy_s(cp, 3 + 1, "abc");
//也可以写 *(cp + 0) = 'a'; *(cp + 1) = 'b'; ...(用循环语句什么的也可以)
cout<<cp<<endl;
}
其实这样还是挺麻烦的
直接用 string类 最方便的了。
6 楼
cook_ [专家分:0] 发布于 2011-05-14 23:32:00
那怎么在release模式下可以运行呢,也不会报错
7 楼
Pony279 [专家分:10] 发布于 2011-05-14 23:42:00
在realese 模式下生成的exe文件是非常精简的,一般只执行你写的代码上的内容不帮你查错,代码确实出错了,只是程序不知道。而且出错的后果可能不会立刻表现出来。
出错的后果严不严重就看你错误类型和你的运气了。
(刚才我在realese下加了输出语句,最后输出的还是 "xyz" ,既不报错也没有修改成功,这个我就不会解释了。。。)
8 楼
windy0will [专家分:2300] 发布于 2011-05-14 23:50:00
release版本能运行,这就不知道了。不过,能确定一定是正常运行?在return前面加一句puts(cp)看看。
9 楼
漫步归来 [专家分:0] 发布于 2011-05-18 14:49:00
上楼说的对~
我来回复