来自SDL_FreeSurface的奇怪的段错误

时间:2016-11-08 20:33:09

标签: c segmentation-fault sdl

我有以下简单的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函数才能正常工作。我完全混淆了导致这种情况的原因。

2 个答案:

答案 0 :(得分:5)

请重命名您的功能

heroService

因为void close(SDL_Window **win, SDL_Surface **surf) 是标准的C库函数。

答案 1 :(得分:2)

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

我需要一位专家&#39;意见,如果这是一个gcc错误。

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