我当时使用Code :: Blocks制作游戏,并遇到了Segmentation Fault错误。我在这里浏览了其他问题,找不到任何帮助。我有一个Sprite类,它表示游戏中的基本对象,还有一个Window类,用于控制游戏屏幕的显示。我运行了调试器,它在下面的return image;方法的getImage()行中给了我错误。

SDL_Surface* Sprite::getImage() {
    return image;
}


我在setImage()的构造函数中调用以下Sprite方法,并且验证了SDL_ConvertSurface没有返回NULL

void Sprite::setImage(string path) {
    SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
    if( loadedSurface == NULL ) {
        printf( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError() );
    } else {
        image = SDL_ConvertSurface( loadedSurface, surface->format, NULL );
        if( image == NULL ) {
            printf( "Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
        }

        SDL_FreeSurface( loadedSurface );
    }
}


我在getImage()mainloop()中调用方法Window,如下所示,其中sprites声明为Sprite* sprites[10];

void Window::mainloop() {
    bool quit = false;
    SDL_Event e;

    while( !quit ) {
        while( SDL_PollEvent( &e ) != 0 ) {
            if( e.type == SDL_QUIT ) {
                quit = true;
            }
        }

        SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, red, green, blue ) );

        for (int i = 0; i < spritesNum; i++) {
            SDL_BlitScaled( sprites[spritesNum]->getImage() , NULL, screenSurface, sprites[spritesNum]->getRect() );
        }

        SDL_UpdateWindowSurface( window );
    }
}

最佳答案

您可能在这里索引超出范围

for (int i = 0; i < spritesNum; i++) {
    SDL_BlitScaled( sprites[spritesNum]->getImage() , NULL, screenSurface, sprites[spritesNum]->getRect() );
}


我假设您想使用计数器i

for (int i = 0; i < spritesNum; i++) {
    SDL_BlitScaled( sprites[i]->getImage() , NULL, screenSurface, sprites[i]->getRect() );
}


否则,如果数组sprites的长度为spritesNum,则索引超出范围,并且执行spritesNum次。

无论如何,您至少应该确认您没有在这里取消引用空指针

sprites[i]->getImage()

09-15 17:18