SDL2 Segfault in SDL_FillRect

SDL2 Segfault in SDL_FillRect

本文关键字:FillRect SDL in Segfault SDL2      更新时间:2023-10-16

终端输出:

    > ./a.out 
    bla1
    Speicherzugriffsfehler

Speicherzugriffsfhler在德语中的意思基本上是分段错误。

当我使用全局变量,或者将函数中的代码复制粘贴到main中时,它只是起作用。我不知道它为什么坏了。

使用:g++sdl.cpp-lSDL2 在Linux Mint 16上编译

源代码:

#include <iostream>
#include <SDL2/SDL.h>
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
using namespace std;
bool init_SDL(SDL_Window *window, SDL_Surface *windowSurface);
void close_SDL(SDL_Window *window, SDL_Surface *image);
int main(int argc, char *argv[])
{
    SDL_Window *window = NULL;
    SDL_Surface *windowSurface = NULL;
    SDL_Surface *image = NULL;
    if(!init_SDL(window, windowSurface)){
        cout << "Failed to initialize SDL" << endl;
    }
    else{
        cout << "bla1" << endl;
        SDL_FillRect(windowSurface, NULL, SDL_MapRGB(windowSurface->format, 0xFF, 0xFF, 0xFF));
        cout << "bla2" << endl;
        SDL_UpdateWindowSurface(window);
        cout << "bla3" << endl;
        SDL_Delay(2000);
    }
    close_SDL(window, image);
    EXIT_SUCCESS;
}
bool init_SDL(SDL_Window *window, SDL_Surface *windowSurface){
    bool success = true;
    if(SDL_Init(SDL_INIT_VIDEO) < 0){
        cout << "SDL failed to initialize! SDL_Error: " << SDL_GetError() << endl;
        success = false;
    }
    else{
        window = SDL_CreateWindow("SDL Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
        if(window == NULL){
            cout << "Failed to create window! SDL_Error: " << SDL_GetError() << endl;
            success = false;
        }
        else{
            windowSurface = SDL_GetWindowSurface(window);
        }
    }
    return success;
}
void close_SDL(SDL_Window *window, SDL_Surface *image){
    SDL_FreeSurface(image);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return;
}

我在reddit上得到了解决方案。这解决了问题:

bool init_SDL(SDL_Window *&window, SDL_Surface *&windowSurface)

我需要通过引用传递指针,因为指针本身在函数中被操纵。否则,它们仍将指向main中的null。