分段故障初始化SDL2。我记忆力怎么样?

时间:2017-01-30 22:17:41

标签: c sdl sdl-2

这只是假设将bmp图像显示到SDL窗口前缓冲区。我玩了代码。我认为我的init()函数有问题。我是SDL的新手。但是我的指针或者我对SDL的功能缺少的东西一定有问题 编辑:我使用GDB,结果我的close()函数是问题。我相信这是因为我释放了设置为NULL的内存?我摆脱了关闭功能,只是在延迟功能后释放了mem。

#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdbool.h>
#define SCREENWIDTH 640
#define SCREENHEIGHT 480
SDL_Window *win = NULL;
SDL_Surface *scrn = NULL;
SDL_Surface *mscrn = NULL;
bool init()
{
   bool suc = true;
   char name[11] = "Hello SDL";
   if (SDL_Init(SDL_INIT_VIDEO) != 0) {
    printf("%s", SDL_GetError());
    suc = false;
   } 
  win = SDL_CreateWindow(name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREENWIDTH, SCREENHEIGHT, SDL_WINDOW_SHOWN);
  if (win == NULL) {
    printf("%s", SDL_GetError());
    suc = false;
  }
scrn = SDL_GetWindowSurface(win);

return suc;
}   
bool loadmedia()
 {
   bool suc = true;
   mscrn = SDL_LoadBMP("hello_world.bmp");
   if (mscrn == NULL) {
   printf("%s", SDL_GetError());
   suc = false;
  }
   return suc;
} 
void close()
{
  SDL_FreeSurface(mscrn);
   SDL_DestroyWindow(win);
   SDL_Quit();
}
int main(int argc, char* args[])
{
 if (!init()) {
   close();
   return 1;
  } 
  if (!loadmedia()) {
   close();
   return 1;
  } 
   SDL_BlitSurface(mscrn, NULL, scrn, NULL);
   SDL_UpdateWindowSurface(win);
   SDL_Delay(3000);

   close();
   return 0;
}

1 个答案:

答案 0 :(得分:3)

您应该找到合理的调试器和其他工具来找出导致错误的行以及原因。基本上它可以归结为使用调试器,如果你正在使用它,或者使用非常好的代码分析工具Valgrind,它通常会随IDE一起提供。

如果您正在使用gcc,则可以使用gdb轻松调试程序。以下是一些有关如何帮助您诊断分段错误的资源:

熟悉这些工具,因为当您遇到新问题时,它们将为您节省无数个小时。