来自SDL_FreeSurface的奇怪段错误

我有以下简单的SDL代码:

#include  #include  #include  // helpers bool init(SDL_Window **win, SDL_Surface **surf) { int const width = 800; int const height = 600; if (SDL_Init(SDL_INIT_VIDEO) != 0) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); return false; } *win = SDL_CreateWindow("Picture test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0); if (*win == NULL) { fprintf(stderr, "Unable to create window: %s\n", SDL_GetError()); return false; } *surf = SDL_GetWindowSurface(*win); return true; } bool load_media(SDL_Surface **surf) { *surf = SDL_LoadBMP("./sample.bmp"); if (*surf == NULL) { fprintf(stderr, "Unable to load data: %s\n", SDL_GetError()); return false; } return true; } void close(SDL_Window **win, SDL_Surface **surf) { SDL_FreeSurface(*surf); SDL_DestroyWindow(*win); SDL_Quit(); } int main() { SDL_Window *win; SDL_Surface *surf; SDL_Surface *img; if (!init(&win, &surf)) { return EXIT_FAILURE; } if (!load_media(&img)) { return EXIT_FAILURE; } SDL_BlitSurface(img, NULL, surf, NULL); SDL_UpdateWindowSurface(win); SDL_Delay(2000); close(&win, &img); } 

我的代码总是在close SDL_FreeSurface(*surf)根据GDB的段错误的起源是行SDL_FreeSurface(*surf) )。 更奇怪的是,如果我用它的定义替换close的调用,这仍然是完全相同的地方。 具体来说,如果我将close(&win, &img)替换为:

 SDL_FreeSurface(img); SDL_DestroyWindow(win); SDL_Quit(); 

代码仍然在完全相同的地方进行段错误,即使该函数甚至没有被调用。 只有当我删除整个closefunction时才能正常工作。 我完全混淆了可能导致这种情况的原因。

请重命名您的function

 void close(SDL_Window **win, SDL_Surface **surf) 

因为close是标准的C库函数。

我可以证实这一点。 相同的情况。 即使使用-Wall-Wextra ,编译器也没有吐出重新声明警告。 open()

如果这是一个gcc错误,我需要专家的意见。

  • 解决方案1:将close()声明为静态函数(例如static close() )。
  • 解决方案2:将close()函数重命名为其他函数(例如my_close_foo() )。