尝试轮询事件时出现 SDL2 分段错误

SDL2 Segmentation fault when trying to Poll Event

我想创建一个小程序,它应该绘制一些数学函数。

起初我只是写了代码,它应该创建一个小 Window,它应该是可见的,直到我在 window 处点击 X。

#include <iostream>
#include <SDL2/SDL.h>

SDL_Window* window;
SDL_Renderer* renderer;
bool running = true;

bool init() {
    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) return false;
    window = SDL_CreateWindow("Visual Functions", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 100, 200, SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if(window == NULL) return false;
    if(renderer == NULL) return false;
    std::cout << "App and SDL init success" << std::endl;
    return true;
}

void onEvent(SDL_Event* event) {
    switch (event->type)
    {
    case SDL_QUIT:
        running = false;
        break;
    
    default:
        break;
    }
}

void loop() {
    SDL_Event* event;
    while(SDL_PollEvent(event)) onEvent(event);
}

void cleanUp() {
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
}


int main(int, char**) {
    if(!init()) {
        std::cout << "SDL or/and App init failed" << std::endl;
        exit(-1);
    }

    while(running) loop();

    cleanUp();
}

但是 window 上下弹出的速度如此之快,以至于我什至看不到它,在命令中首先是 App and SDL init success,然后是 Segmentation fault。 在另一个代码中,具有相同的初始化和循环代码运行得很好并且一切都正常显示(至少对于 SDL 部分)。 我发现一些调试消息,循环没有到达事件函数,也没有到达循环函数的末尾,所以问题是 SDL_PollEvent(event),但问题是什么以及如何解决它?

您永远不会创建您正在使用的 SDL_Event 结构:

void loop() {
    SDL_Event* event;
    while(SDL_PollEvent(event)) onEvent(event);
}

应该是这个

void loop() {
    SDL_Event event;
    while(SDL_PollEvent(&event)) onEvent(&event);
}