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
相关产品推荐
相关产品推荐

