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

Mil*_*ilk 18 c++ access-violation

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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){};
Run Code Online (Sandbox Code Playgroud)

MovingObject构造函数

MovingObject::MovingObject(const char *pic, int x, int y, int w, int h):picture(pic), positionX(x), positionY(y), width(w), height(h) {};
Run Code Online (Sandbox Code Playgroud)

Tne*_*ppa 28

" 访问冲突读取位置0x00000000 "意味着您要取消呈现尚未初始化的指针,因此具有垃圾值.这些垃圾值可能是任何东西,但通常它恰好是0,因此您尝试从内存地址读取0x0操作系统检测到并阻止您执行操作.

检查并确保阵列invaders[]符合您的认为.

此外,您似乎没有被更新i过-这意味着你将保持在同一Invader对象为定位0invaders[]在每个循环迭代.


Fra*_*ser 11

这条线看起来很可疑:

invaders[i] = inv;
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

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