此函数导致 window 为空然后崩溃

This function cause the window to be blank then crashes

我试图找到为什么这样的代码不起作用,经过一些测试我发现函数 submitSprite 有崩溃的原因,但我不知道如何修复它

#include "renderer.h"

Renderer newRenderer(SDL_Window* window)
{
    Renderer renderer;
    renderer.renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

    return renderer;
}

void destroyRenderer(Renderer renderer)
{
    SDL_DestroyRenderer(renderer.renderer);
}

void submitSprite(Renderer renderer, Sprite sprite)
{
    SDL_Rect* rect;
    rect->x=sprite.x;
    rect->y=sprite.y;
    rect->w=sprite.w;
    rect->h=sprite.h;

    SDL_RenderCopy(renderer.renderer, sprite.texture, NULL, rect);
}

void render(Renderer renderer)
{
    SDL_RenderPresent(renderer.renderer);
    SDL_RenderClear(renderer.renderer);
}

renderer.renderer 是一个 SDL_Renderer*

void submitSprite(Renderer renderer, Sprite sprite)
{
    SDL_Rect* rect;
    rect->x=sprite.x;
    rect->y=sprite.y;
    rect->w=sprite.w;
    rect->h=sprite.h;

    SDL_RenderCopy(renderer.renderer, sprite.texture, NULL, rect);
}

在这里您访问了一个从未被初始化的指针。因此,要么使用局部变量,要么为其分配(和释放)内存。

即:

void submitSprite(Renderer renderer, Sprite sprite)
{
    SDL_Rect rect;
    rect.x=sprite.x;
    rect.y=sprite.y;
    rect.w=sprite.w;
    rect.h=sprite.h;

    SDL_RenderCopy(renderer.renderer, sprite.texture, NULL, &rect);
}

我无法发表评论,但我想补充一点,您应该创建 SDL_Rendererone 实例,而不是在需要时继续创建实例。正如 Devolus 所说,通过指针传递。如果您忘记调用 SDL_DestroyRenderer(),则在创建后按值传递也会导致内存泄漏,这也会增加该方法的速度。当你需要渲染器时,有参数 SDL_Renderer* renderer