Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问冲突写入位置0xCCCC_C++_Access Violation - Fatal编程技术网

C++ 访问冲突写入位置0xCCCC

C++ 访问冲突写入位置0xCCCC,c++,access-violation,C++,Access Violation,在过去的两天里,我一直被一个我似乎无法摆脱的违规行为所困扰。 我已经使用了断点并找到了错误所在的位置,但我只是希望你们中的一位能够知道问题所在,而无需我复制并粘贴所有代码-- 我要走了 Escape.exe中0x1027cb1a(msvcr100d.dll)处的首次机会异常:0xC0000005:访问冲突写入位置0xCCCC。 Escape.exe中0x1027cb1a(msvcr100d.dll)处的未处理异常:0xC0000005:访问冲突写入位置0xCCCC 现在,快速的谷歌搜索让我觉得有

在过去的两天里,我一直被一个我似乎无法摆脱的违规行为所困扰。 我已经使用了断点并找到了错误所在的位置,但我只是希望你们中的一位能够知道问题所在,而无需我复制并粘贴所有代码--

我要走了

Escape.exe中0x1027cb1a(msvcr100d.dll)处的首次机会异常:0xC0000005:访问冲突写入位置0xCCCC。 Escape.exe中0x1027cb1a(msvcr100d.dll)处的未处理异常:0xC0000005:访问冲突写入位置0xCCCC

现在,快速的谷歌搜索让我觉得有些奇怪的事情正在发生。所有的搜索结果都是关于实际上没有指向任何地方的指针(0xCCCCC是一个低内存地址?)

我还没有在代码中使用指针,但无论如何,我都会粘贴函数并指出引发异常的行(粗体):

void mMap::fillMap(){

对于(int i=0;i未初始化的指针或存储在内存中已释放的指针。我认为
cccc
是第一个,而
cdcdcdcd
是第二个,但它随编译器/库实现而变化

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


也可能发生
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])
这个未初始化的
0xCCCC
。显然
部分的
偏移量是零,
i
z
在第一次通过循环时都是零,所以你得到
0xCCCC+0+0+0
作为内存地址



要对此进行调试,请使用调用堆栈并找到调用了
fillMap
的函数。然后签入用于成员访问的指针所在的函数(
->
)来自MSVC++上的。

,在调试模式下,调试内存分配器将所有返回的内存设置为0xCCCC,以查找未定义行为的情况。很可能,您从未初始化过
myMap
,或
myMap
中的某些指针。请检查初始化代码是否存在错误。

了解所有答案关于这个问题的注释,下面是关于Visual C++中内存填充的好参考:


当我试图用for循环填充我自己类类型的表元素中的字符串值时,出现了类似的错误。我在该表中声明了1000个元素,所以我将类似的内容放在了下面:

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

for(int i=0;i因此,如果您注释掉代码的这一部分,一切正常?myMap在哪里初始化?myMap在mMap.h Tile myMap[10][20]中;myMap已在mMap.h文件中声明为:Tile myMap[10][20]@Linky:查看我的编辑。此地址几乎总是由未设置指针引起的,在您的情况下,
myMap
不是指针,因此它必须是指向包含
myMap
的类的指针,这很糟糕。@Ben Voigt,感谢您的帮助。虽然类型为Tile(Tile类)的数组myMap是在mMap.h文件中声明的。@Linky:我理解。这是我答案的第二部分和第三部分讨论的情况。我正在用驱动程序类测试这些类。如果我输入:mMap mappy;通过调用mMap类的构造函数,它将调用fillMap()这就是错误发生的地方。myMap数组是本地的,这就是为什么抛出与指针相关的错误使我感到困惑。平铺myMap[10][20];请告诉我如何正确初始化。0xCCCC在使用/GZ时发生。三年后,但这可能会帮助其他人解决类似问题。:)干杯!
    for (int i = 0; i <= 1000; i++)
    {
        TAble[i].name = "Some Guy";
        TAble[i].age = 4;
    }