微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 访问冲突写入位置0xcccccccc

在过去的两天里,我被困在一个违法行为上,我似乎无法逃避.
我已经使用了断点,并且位于错误的地方,但我只是希望你们中的一个会知道什么是没有我必须复制粘贴我所有的代码

我越来越

First-chance exception at 0x1027cb1a (msvcr100d.dll) in Escape.exe: 0xC0000005: Access violation writing location 0xcccccccc.
Unhandled exception at 0x1027cb1a (msvcr100d.dll) in Escape.exe: 0xC0000005: Access violation writing location 0xcccccccc.

现在,一个快速的谷歌搜索让我觉得有一些奇怪的事情发生.所有的搜索结果都会谈到指针不在任何地方(0xccccccccc是低内存地址?).

我还没有在我的代码中使用指针,但是我将粘贴函数并指出异常抛出的行(粗体):

void mMap::fillMap(){
    for(int i = 0; i <= 9; i++){
        for(int z = 0; z <= 19; z++){
            Tile t1;    // default Tile Type = "NULLTILE"
            myMap[i][z] = t1;
        }
    }
}

现在myMap是一个2D数组,类型为Tile.几天前我有这个工作,直到我添加了一些其他类,并且都停止工作!

解决方法

未初始化的指针或存储在内存中的指针已被释放.我认为cccccccc是第一个,cdcdcdcd是第二个,但是它与编译器/库实现有所不同.

对于您的特定代码,可能myMap尚未分配,那么myMap [0] [0]将导致对0xcccccccc的访问尝试.

还可能发生myMap是你的类的开始,并且类指针未初始化:

class mMap
{
     Tile myMap[10][20];
public:
     void f() { myMap[0][0] = 0; }
};

mMaP* what;
what->f(); // what is an invalid pointer

这是因为成员函数不是虚拟的,因此编译器知道要运行的代码,并将对象指针作为隐藏参数传递.最终,编译器会发出如下计算:

this + offsetof(Whatever::myMap) + z * sizeof(myMap[0]) + i * sizeof(myMap[0][0])

这是未初始化的,为0xcccccccc.显然,offsetoff部分是零,i和z在你的循环首次都是零,所以你得到0xcccccccc 0 0 0作为内存地址.

要调试这个,使用调用堆栈并找到名为fillMap的函数.然后检查那个函数,其中用于成员访问的指针( – >)来自.

原文地址:https://www.jb51.cc/c/113102.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐