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

时间:2012-05-07 08:28:42

标签: c++ access-violation

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

  

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

当我在下面加入一段代码时。 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) {};

3 个答案:

答案 0 :(得分:26)

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

检查并确保数组invaders[]符合您的认为。

此外,您似乎永远不会更新i - 这意味着您在每次循环迭代时都将相同的Invader对象放置在0的{​​{1}}位置

答案 1 :(得分:10)

这一行看起来很可疑:

invaders[i] = inv;

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

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

答案 2 :(得分:4)

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