You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言使用SDL2避免全局SDL_Window的指针问题求助

问题分析

你的问题核心是C语言的参数值传递机制导致的。当你把SDL_Window* window传入init函数时,函数收到的是这个指针的副本——也就是说,init里的win和main里的window是两个独立的指针变量,只是初始值相同(都是NULL)。当你在init里执行win = SDL_CreateWindow(...),只是修改了副本win的指向,完全不会影响main里原本的window指针,所以main里的window依然是NULL。

另外注意:你代码里的SDL_INIT_EVERETHING是拼写错误,正确的是SDL_INIT_EVERYTHING,这个错误也可能导致初始化失败,记得修正。

解决方法

有两种常见的修正方式:

方法1:使用二级指针(指针的指针)

把init函数的参数改为SDL_Window** win,这样就能通过指针的指针修改原指针的指向:

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

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600

void init(SDL_Window **win) {
    // 检查SDL初始化是否成功
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        printf("SDL初始化失败: %s\n", SDL_GetError());
        return;
    }
    // 通过二级指针修改原指针的指向
    *win = SDL_CreateWindow("PONG", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
    if (*win == NULL) {
        printf("窗口创建失败: %s\n", SDL_GetError());
    }
}

int main() {
    SDL_Window *window = NULL;
    // 传入指针的地址
    init(&window);
    if (window == NULL) {
        printf("error!\n");
        SDL_Quit();
        return 1;
    }

    // 示例:窗口停留2秒后关闭
    SDL_Delay(2000);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

方法2:让init函数返回SDL_Window指针

直接把创建好的窗口指针作为函数返回值返回给main函数,逻辑更直观:

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

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600

SDL_Window* init() {
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        printf("SDL初始化失败: %s\n", SDL_GetError());
        return NULL;
    }
    SDL_Window *win = SDL_CreateWindow("PONG", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
    if (win == NULL) {
        printf("窗口创建失败: %s\n", SDL_GetError());
        SDL_Quit();
    }
    return win;
}

int main() {
    SDL_Window *window = init();
    if (window == NULL) {
        printf("error!\n");
        return 1;
    }

    // 示例:窗口停留2秒后关闭
    SDL_Delay(2000);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}
额外提示
  • 一定要检查SDL_Init和SDL_CreateWindow的返回值,SDL提供的SDL_GetError()能给出具体错误信息,方便排查问题。
  • 程序结束时必须调用SDL_DestroyWindow释放窗口资源,再调用SDL_Quit退出SDL,避免内存泄漏。

内容的提问来源于stack exchange,提问作者evolhart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:33:24