回 帖 发 新 帖 刷新版面

主题:请大侠帮忙看下,为啥出错

1--int main()
2--{
3--    char* const cp = "xyz";
4--    *cp = 'a';
5--    return 0;
6--}

在debug模式下,调试到第四行的时候会出现“File.exe 中的 0x004114d8 处未处理的异常: 0xC0000005: 写入位置 0x00416800 时发生访问冲突”错误,怎么回事呢,给个详细的解释吧,拜谢

回复列表 (共9个回复)

沙发

我复制过来执行,没出错呀。。。

板凳


我说的事debug模式下,你在第四行设置个断点啊,调试下,就看到了

3 楼

刚才是用realese模式执行的,所以没出错,呵呵,不好意思
这个应该是因为字符串 "xyz" 本身是常量(文字常量,记得好像是这样叫的)

4 楼

其实代码中有一个错误,
cp只是一个指针,而它指向一个字符串常量。编译器一般会把所有的字符串常量放到只读空间里面,不能写。而楼主您下面那句赋值语句明显要写cp所指向的空间,而它的属性是不能写,故出现了访问违例。

5 楼

不知道你学了数组和动态内存分配没有,如果你想要让它可以修改的话可以这样写:
#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 楼


那怎么在release模式下可以运行呢,也不会报错

7 楼

在realese 模式下生成的exe文件是非常精简的,一般只执行你写的代码上的内容不帮你查错,代码确实出错了,只是程序不知道。而且出错的后果可能不会立刻表现出来。
出错的后果严不严重就看你错误类型和你的运气了。
(刚才我在realese下加了输出语句,最后输出的还是 "xyz" ,既不报错也没有修改成功,这个我就不会解释了。。。)

8 楼

release版本能运行,这就不知道了。不过,能确定一定是正常运行?在return前面加一句puts(cp)看看。

9 楼

上楼说的对~

我来回复

您尚未登录,请登录后再回复。点此登录或注册