0xC0000005:访问冲突读取位置0x00000000

问题描述 投票:14回答:3

对于我正在研究的太空入侵者游戏,我遇到了一个非常奇怪的问题。基本上我收到访问冲突错误:

SpaceInvaders.exe中0x5edad442(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

当我在下面包含这段代码时。 visual studio在调试时带我去“strcmp.asm”。请注意,我没有在任何代码中使用strcmp()。代码有什么问题,或者这个问题是否超出了我所包含的范围?谢谢你的帮助

const char* invarray[] = {"invader0.png", "invader1.png", "invader2.png", "invader3.png", "invader4.png"}; 
int i=0;
//Creates 55 invaders
for (int y=0; y<250; y+=50){
    for (int x=0; x<550;x+=50){
        Invader inv(invarray[y/50], x+50, y+550, 15, 15, 1, false, 250);
        invaders[i] = inv;
    }
}

Invader构造函数:

Invader::Invader(const char *pic, int x, int y, int w, int h, bool dir, bool des, int point) : MovingObject(pic, x, y, w, h) , direction(dir), destroyed(des), b(0), points(point){};

MovingObject构造函数

MovingObject::MovingObject(const char *pic, int x, int y, int w, int h):picture(pic), positionX(x), positionY(y), width(w), height(h) {};
c++ access-violation
3个回答
10
投票

这条线看起来很可疑:

invaders[i] = inv;

你永远不会增加i,所以你继续分配给invaders[0]。如果这只是在将代码缩减到示例时所犯的错误,请检查如何在实际代码中计算i;你可能会超过invaders的大小。

如果您的评论建议,您正在创建55 invaders,然后检查invaders是否已正确初始化以处理此数字。


26
投票

“访问冲突读取位置0x00000000”表示您是尚未初始化的derefrencing a pointer,因此具有垃圾值。那些垃圾值可能是任何东西,但通常它恰好是0,所以你试图从内存地址0x0读取,操作系统检测到并阻止你这样做。

检查并确保数组invaders[]是您认为应该的。

此外,你似乎没有更新i - 这意味着你在每次循环迭代时都将相同的Invader对象放置在0的位置invaders[]中。


4
投票

这里的问题,如其他注释中所解释的那样,指针在没有被正确初始化的情况下被取消引用。像Linux这样的操作系统将最低地址(例如,前32MB:0x00_0000 -0x200_0000)保留在进程的虚拟地址空间之外。这样做是因为取消引用归零的非初始化指针是一个常见的错误,就像在这种情况下一样。因此,当发生这种类型的错误时,不是实际读取恰好位于地址0x0的随机变量(而不是指针在正确初始化时将用于的存储器地址),指针将从外部的存储器地址读取。进程的虚拟地址空间。这会导致页面错误,从而导致分段错误,并且会向进程发送信号以将其终止。这就是您获得访问冲突错误的原因。

© www.soinside.com 2019 - 2024. All rights reserved.