在Elements.exe中0x00007FF63C04254B抛出异常:0xC0000005:访问冲突读取位置0xff



在main.cpp中有两个数组,如下所示:

...
Element* screen, *buffer;
screen = new Element[GAME_WIDTH * GAME_HEIGHT];
buffer = new Element[GAME_WIDTH * GAME_HEIGHT];
memset(screen, 0, GAME_WIDTH * GAME_HEIGHT * sizeof(Element));
memset(buffer, 0, GAME_WIDTH * GAME_HEIGHT * sizeof(Element));
...

并且,在my element .cpp中有一个函数使用以下数组之一:

void drawElements(Element* screen[GAME_WIDTH * GAME_HEIGHT]) {
for (int x = 1; x < GAME_WIDTH - 2; x++) {
for (int y = 1; y < GAME_HEIGHT - 2; y++) {
std::cout << screen[idx(x, y)]->id << std::endl; //Temporary, problem here

}
}
}

当前应该做的只是多次打印0,而不是在调试时抛出该问题标题中所示的异常,就在em.cpp代码片段中的注释处。我读到过,这可能是由于没有初始化对象造成的,但我认为它们是初始化的,因为它们在main.cpp代码片段中被创建并全部设置为0。

我对指针和类似的东西相当陌生,所以这个问题完全有可能是由指针和引用的一些简单的怪癖引起的,但我不太确定发生了什么。

下面是Element结构体的定义:

struct Element {
int id;
float lifetime;
int density;
};

对于那些要求它的人,这里是我在我的问题的一个最小可复制的例子的尝试,它抛出了同样的异常,当通过vc++调试器运行。

struct Broken {
int x = 20;
};
void doSomething(Broken* borked[10000]) {
for (int x = 1; x < 10000 - 1; x++) {
std::cout << borked[x]->x << std::endl; //Throws exception here
}
}
int main()
{
Broken* borked;
borked = new Broken[10000];
memset(borked, 0, 10000 * sizeof(Broken));
doSomething(&borked);
}

声明什么"single"是一个单指针。

变量"screen"在"图纸"中声明;是双指针,而不是单指针。此外,在访问数组中的变量时,不要使用操作符->

Element* screen, *buffer; // <= definition single pointer
screen = new Element[GAME_WIDTH * GAME_HEIGHT]; 
void drawElements(Element* screen[GAME_WIDTH * GAME_HEIGHT]){ // <= this mean double pointer
for (int x = 1; x < GAME_WIDTH - 2; x++) {
for (int y = 1; y < GAME_HEIGHT - 2; y++) {
std::cout << screen[idx(x, y)]->id << std::endl; //Invalid variable access

}
}
}
// wrong call element
std::cout << screen[idx(x, y)]->id << std::endl;
// correct call element
std::cout << screen[idx(x, y)].id << std::endl;
D
void drawElements(Element* screen) {
for (int x = 1; x < GAME_WIDTH - 2; x++) {
for (int y = 1; y < GAME_HEIGHT - 2; y++) {
std::cout << screen[idx(x, y)].id << std::endl; //Temporary, problem here

}
}
}

另一个这

void drawElements(Element screen[GAME_WIDTH * GAME_HEIGHT]) {
for (int x = 1; x < GAME_WIDTH - 2; x++) {
for (int y = 1; y < GAME_HEIGHT - 2; y++) {
std::cout << screen[idx(x, y)].id << std::endl; //Temporary, problem here

}
}
}

p。为什么在这个实现中使用单个数组?在这种情况下,通常使用双数组来分隔宽度和高度。

相关内容

  • 没有找到相关文章