对于我正在研究的太空入侵者游戏,我遇到了一个非常奇怪的问题。基本上我收到了访问冲突错误:
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) {};
答案 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的随机变量(而不是指针在正确初始化时将用于的存储器地址),指针将从外部的存储器地址读取。进程的虚拟地址空间。这会导致页面错误,从而导致分段错误,并且会向进程发送信号以将其终止。这就是您收到访问冲突错误的原因。