来自SDL_FreeSurface的奇怪的段错误

Koz*_*oss 1 c sdl segmentation-fault

我有以下简单的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);
}
Run Code Online (Sandbox Code Playgroud)

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

SDL_FreeSurface(img);
SDL_DestroyWindow(win);
SDL_Quit();
Run Code Online (Sandbox Code Playgroud)

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

Wea*_*ane 5

请重命名您的功能

void close(SDL_Window **win, SDL_Surface **surf)
Run Code Online (Sandbox Code Playgroud)

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