【发布时间】:2016-11-08 20:33:08
【问题描述】:
我有以下简单的 SDL 代码:
#include <SDL.h>
#include <stdbool.h>
#include <stdio.h>
// 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 上出现段错误(根据 GDB,段错误的起源是 SDL_FreeSurface(*surf) 行)。更奇怪的是,如果我用它的定义替换对close 的调用,这仍然会在完全相同的位置出现段错误。具体来说,如果我将close(&win, &img) 替换为:
SDL_FreeSurface(img);
SDL_DestroyWindow(win);
SDL_Quit();
代码仍然在完全相同的位置出现段错误,即使该函数甚至没有被调用。只有当我删除整个 close 函数时,它才能正常工作。我完全不知道是什么原因造成的。
【问题讨论】:
-
你知道有一个C库函数
int close(int fd);吗?是否有任何冲突 - 编译器警告? -
@WeatherVane 我尝试将
close重命名为其他名称,然后修复了它!令人惊讶的是,尽管有所有可以想象的警告,编译器仍然接受它! -
@KozRoss 此外,它可能会在没有任何警告的情况下被接受,因为在 glibc 中
close(和许多其他人)是一个弱符号。使用这种简单的名称(和有限的范围),使用static函数可能是合理的。
标签: c segmentation-fault sdl