首页 文章

访问冲突写入位置0xcccccccc

提问于
浏览
10

在过去的两天里,我一直陷入违规行为,我似乎无法逃脱 . 我已经使用了断点并找到了错误的位置,但我只是希望你们中的一个人知道问题是什么而我不必复制粘贴所有代码 - .-

我越来越

Escape.exe中0x1027cb1a(msvcr100d.dll)的第一次机会异常:0xC0000005:访问冲突写入位置0xcccccccc . Escape.exe中0x1027cb1a(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突写入位置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是一个类型为Tile的二维数组 . 几天前我有这个工作,直到我添加了一些其他类,它都停止了工作!

4 回答

  • 0

    对于这个问题中发生的所有答案和评论,这里有关于Visual C中内存填充的很好的参考:

  • 12

    在MSVC和调试模式下,调试内存分配器将所有返回的内存设置为0xcccccccc,以查找未定义行为的情况 . 很可能,你从未初始化 myMap ,或 myMap 内部的一些指针 . 检查初始化代码是否存在错误 .

  • 1

    当我尝试用for-loop填充我自己类类型的表元素中的字符串值时出现类似错误 . 我在那个表中声明了1000个元素,所以我放了这样的东西:

    for (int i = 0; i <= 1000; i++)
        {
            TAble[i].name = "Some Guy";
            TAble[i].age = 4;
        }
    

    不幸的是,与字符串一样,我发现我可能坚持不存在的fillinf元素,表格中的元素编号为1000 . 我设法通过改变循环 Headers 来解决这个问题,在1000之前删除等号 .

    试着看看你是不是想打电话给那些不存在的东西 .

  • 3

    未初始化的指针,或存储在已释放的内存中的指针 . 我认为 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])
    

    this ,未初始化,是 0xcccccccc . 显然 offsetof 部分为零,并且 iz 在第一次循环时都为零,因此您将获得 0xcccccccc + 0 + 0 + 0 作为内存地址 .


    要调试它,请使用调用堆栈并找到调用 fillMap 的函数 . 然后检查用于成员访问的指针( -> )来自的函数 .

相关问题