C++ 使用对象指针时的访问冲突读取

C++ 使用对象指针时的访问冲突读取,c++,arrays,object,pointers,struct,C++,Arrays,Object,Pointers,Struct,在开始时,我的程序创建了一个结构和一个类,其中包含一个struct和两个int变量 #define fullwidth 200 #define fullheight 200 typedef struct tiles { unsigned char red, green, blue; char* name; }tiles; class Units { public: int X_Pos; int Y_Pos; tiles MapColour; } 之后,在主要部分中,我

在开始时,我的程序创建了一个结构和一个类,其中包含一个struct和两个int变量

#define fullwidth 200
#define fullheight 200

typedef struct tiles
{
    unsigned char red, green, blue;
    char* name;
}tiles;

class Units
{
public:

int X_Pos;
int Y_Pos;

tiles MapColour;

}
之后,在主要部分中,我创建了一个二维数组以使用
tiles
作为RGB容器进行显示,并创建了一个对象指针数组以跟踪声明对象中的任何更改

int i, j;

tiles fieldd[fullwidth][fullheight];

Units* DetectorField[fullwidth][fullheight];

Units Objects[10];
在那之后(现在在
main()
),我上载了两个具有有效值的数组,避免了这方面的问题

for (j=0;j<fullheight;j++)
{
    for (i=0;i<fullwidth;i++)
    {
        fieldd[i][j] = BASE;
        DetectorField[i][j] = NULL;
    }
}
当然,这还可以。但是现在问题来了!在下一段代码中,我检查
DetectorField
的每个元素;如果所选元素尚未为NULL(这显然意味着它只能是对象的内存地址,因为它无法获得任何其他值-如果我知道的话),那么将
MapColour
变量放入结构数组中

for (j=0;j<fullheight;j++)
{
    for (i=0;i<fullwidth;i++)
    {
        if(DetectorField[i][j] != NULL)
        {
            fieldd[i][j] = DetectorField[i][j]->MapColour;
        }
    }
}
对于(j=0;j此循环:

for (i=0; i<9;i++)
{
    Objects[i].X_Pos = i+2;    //just some values, not important yet
    Objects[i].Y_Pos = 2*i+2;
    DetectorField[Objects[i].X_Pos][Objects[i].Y_Pos] = &Objects[i];
}
甚至更好

for (i=0; i<(sizeof(Objects)/sizeof(Objects[0])); i++)

对于(i=0;i您只是存在访问冲突。您应该调试代码,方法是单步执行并单步执行,以找出访问冲突的来源。访问冲突表示您试图引用空引用。请确保在访问对象之前为其分配内存


您有一个for循环,该循环将DetectorField[i][j]=NULL,这意味着位置[i][j]是一个NULL引用。然后您有一个DetectorField[Objects[i].X_Pos][Objects[i].Y_Pos]引用。您可能会遇到一些访问冲突。

省省点麻烦,替换“char*name”使用
std::string
tiles
中使用
std::string
i
j
的值是什么?感谢您的提示;但是,遗憾的是,如果我使用
std::string
,我会出现堆栈溢出。无论如何:即使我更改
fullheight
fullwidth
1,它也会崩溃。如果它使用ful崩溃,那就很奇怪了lheight=fullwidth=1,因为循环不会执行任何操作。哦,等等-忘了这一点!但是数组从0开始计数,不是吗?所以在初始化[10]的情况下,它从[0]计数到[9]-或者不从[9]-当i小于9时运行循环…通过
对象[8]初始化
对象[0]
。如果使用
i<10
i,则从不初始化
对象[9]
for (i=0; i<10; i++)
for (i=0; i<(sizeof(Objects)/sizeof(Objects[0])); i++)