函数入口前的分段错误?
Segmentation fault before function entry?
更新:查看我的答案了解详情,指针错误。
我有一个功能,应该加载一些测试资产并使用 SDL2 将它们 blit 到屏幕上。此函数在执行任何命令之前立即抛出一个段错误,没有明确的原因。请记住,此函数中的某些变量是全局变量。
函数内容:
printf("DEBUG");
int menuSelect = 0;
printf("declare");
SDL_Surface* bg = SDL_LoadBMP("menubg.bmp");
printf("bg load");
SDL_Surface* menu1 = TTF_RenderText_Solid(font,"HACKING PROGRAM",whiteclr);
printf("title blip");
SDL_BlitSurface(bg,NULL,screen,NULL);
printf("event");
SDL_Event* event;
printf("menu2");
SDL_Surface* menu2 = TTF_RenderText_Solid(font,"Hack",whiteclr);
printf("rect");
SDL_Rect menu2r = CreateRect(5,30,menu2->w,menu2->h);
printf("free");
SDL_FreeSurface(menu2);
SDL_FreeSurface(menu1);
while(SDL_WaitEvent(event))
{
switch(event->type)
{
case SDL_MOUSEBUTTONDOWN:
if(event->motion.x > menu2r.x && event->motion.x < menu2r.x+menu2r.w && event->motion.y > menu2r.y && event->motion.y < menu2r.y+menu2r.h)
{
SDL_FreeSurface(bg);
return 0;
}
break;
case SDL_MOUSEMOTION:
if(event->motion.x > menu2r.x && event->motion.x < menu2r.x+menu2r.w && event->motion.y > menu2r.y && event->motion.y < menu2r.y+menu2r.h)
{
menuSelect=1;
}
else
{
menuSelect=0;
}
break;
}
if(menuSelect==1)
{
menu2 = TTF_RenderText_Solid(font,"Hack",selectclr);
}
else
{
menu2 = TTF_RenderText_Solid(font,"Hack",selectclr);
}
}
return 0;
- 仔细检查字体、图像等的路径。它们相对于项目的根目录是否正确?他们相当敏感。为避免此类简单错误:转到第 2 点。
应用一些基本的异常处理。例如:
SDL_Surface* bg = SDL_LoadBMP("menubg.bmp");
if(bg == NULL)
{
// This code will be run when menubg.bmp cannot be loaded.
}
经常检查语句的结果以确保它按计划工作是一种很好的做法。
- 使用调试器。 GDB是最流行的;但我个人使用 DDD,一个在 GDB 上 运行 的可视化调试器。它非常轻巧,同时具有图形输入和控制台输入。
- 记录您的代码。即使这是个人项目并且您不会向任何人展示它。解释每条语句的作用以及为什么需要它;您会对代码有更清晰的认识,您可能会发现问题本身。
此外,它是 while(SDL_WaitEvent(&event))
而不是 while(SDL_WaitEvent(event))
。
这实际上是一个愚蠢的错误,任何刚接触 SDL 的人都可能会遇到这种错误。 WaitEvent(SDL_Event*) 应该被馈送 &event,因为 event 应该是事件,而不是指向事件的指针。通过将 while(SDL_WaitEvent(event))
更改为 while(SDL_WaitEvent(&event))
并将 SDL_Event* event;
更改为 SDL_Event event;
此问题得到解决。
对于遇到任何类型的段错误的其他人,努力调试就可以解决问题。 SO 的这些人极大地帮助了我追查和修复我的愚蠢错误,并教育我成为一名开发人员。
更新:查看我的答案了解详情,指针错误。
我有一个功能,应该加载一些测试资产并使用 SDL2 将它们 blit 到屏幕上。此函数在执行任何命令之前立即抛出一个段错误,没有明确的原因。请记住,此函数中的某些变量是全局变量。
函数内容:
printf("DEBUG");
int menuSelect = 0;
printf("declare");
SDL_Surface* bg = SDL_LoadBMP("menubg.bmp");
printf("bg load");
SDL_Surface* menu1 = TTF_RenderText_Solid(font,"HACKING PROGRAM",whiteclr);
printf("title blip");
SDL_BlitSurface(bg,NULL,screen,NULL);
printf("event");
SDL_Event* event;
printf("menu2");
SDL_Surface* menu2 = TTF_RenderText_Solid(font,"Hack",whiteclr);
printf("rect");
SDL_Rect menu2r = CreateRect(5,30,menu2->w,menu2->h);
printf("free");
SDL_FreeSurface(menu2);
SDL_FreeSurface(menu1);
while(SDL_WaitEvent(event))
{
switch(event->type)
{
case SDL_MOUSEBUTTONDOWN:
if(event->motion.x > menu2r.x && event->motion.x < menu2r.x+menu2r.w && event->motion.y > menu2r.y && event->motion.y < menu2r.y+menu2r.h)
{
SDL_FreeSurface(bg);
return 0;
}
break;
case SDL_MOUSEMOTION:
if(event->motion.x > menu2r.x && event->motion.x < menu2r.x+menu2r.w && event->motion.y > menu2r.y && event->motion.y < menu2r.y+menu2r.h)
{
menuSelect=1;
}
else
{
menuSelect=0;
}
break;
}
if(menuSelect==1)
{
menu2 = TTF_RenderText_Solid(font,"Hack",selectclr);
}
else
{
menu2 = TTF_RenderText_Solid(font,"Hack",selectclr);
}
}
return 0;
- 仔细检查字体、图像等的路径。它们相对于项目的根目录是否正确?他们相当敏感。为避免此类简单错误:转到第 2 点。
应用一些基本的异常处理。例如:
SDL_Surface* bg = SDL_LoadBMP("menubg.bmp"); if(bg == NULL) { // This code will be run when menubg.bmp cannot be loaded. }
经常检查语句的结果以确保它按计划工作是一种很好的做法。
- 使用调试器。 GDB是最流行的;但我个人使用 DDD,一个在 GDB 上 运行 的可视化调试器。它非常轻巧,同时具有图形输入和控制台输入。
- 记录您的代码。即使这是个人项目并且您不会向任何人展示它。解释每条语句的作用以及为什么需要它;您会对代码有更清晰的认识,您可能会发现问题本身。
此外,它是 while(SDL_WaitEvent(&event))
而不是 while(SDL_WaitEvent(event))
。
这实际上是一个愚蠢的错误,任何刚接触 SDL 的人都可能会遇到这种错误。 WaitEvent(SDL_Event*) 应该被馈送 &event,因为 event 应该是事件,而不是指向事件的指针。通过将 while(SDL_WaitEvent(event))
更改为 while(SDL_WaitEvent(&event))
并将 SDL_Event* event;
更改为 SDL_Event event;
此问题得到解决。
对于遇到任何类型的段错误的其他人,努力调试就可以解决问题。 SO 的这些人极大地帮助了我追查和修复我的愚蠢错误,并教育我成为一名开发人员。