2012-05-07 177 views
12

我正在处理一个太空入侵者游戏的一个非常奇怪的问题。基本上我得到一个访问冲突错误:0xC0000005:访问冲突读取位置0x00000000

Unhandled exception at 0x5edad442 (msvcr100d.dll) in SpaceInvaders.exe: 0xC0000005: Access violation reading location 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(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) {}; 
+1

在Invader的构造函数中显示代码 –

+1

错误消息表明这是一个空指针解引用,但是我看不到这会在您的代码中发生。除了入侵者构造函数之外,请告诉我们入侵者数组的初始化位置/方式。 Invader的拷贝构造函数也可能很有趣,如果它有的话。 – Medo42

+0

我刚刚用构造函数更新了OP。@Medo,入侵者数组刚被初始化为全局变量:“Invader invaders [55];” – Milk

回答

10

这行看起来可疑:

invaders[i] = inv; 

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

如果根据您的意见建议,您正在创建55 invaders,然后检查invaders已被正确初始化以处理此号码。

+0

非常感谢,就是这样:s – Milk

22

访问冲突读取位置00000000” 意味着你derefrencing a pointer尚未初始化并因此具有垃圾值。这些垃圾值可能是任何东西,但通常它是0,因此您尝试从内存地址0x0读取,操作系统检测到并阻止您执行此操作。

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

而且,你似乎并不被不断更新i - 这意味着你继续把同Invader对象为位置的invaders[]0在每次循环迭代。

0

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

相关问题