-1

每次我编译我的简单 SDL1.2 代码时,它都会成功编译,但是当我尝试通过终端(Ubuntu 中的alt+ )运行它时:t

./game
Segmentation fault (core dumped)

我得到这个错误。你能帮忙吗?这是代码:

#include<SDL/SDL.h>

int main(int argc,char args)    
{
    SDL_Init( SDL_INIT_EVERYTHING);    
    SDL_Surface* screen;        
    screen=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE);
    SDL_Flip(screen) ![problem running the program][1];
    SDL_Delay(5000);    
    SDL_FreeSurface(screen);    
    SDL_Quit();
}
4

4 回答 4

1

SDL_SetVideoMode返回NULL您不检查的错误。

于 2015-02-09T19:38:41.700 回答
1

由于您是通过终端运行它,我怀疑您可能忘记告诉 Xorg 允许从它运行。事实上,如果这真的是问题,它将阻止任何程序在以这种方式启动时运行。

要解决此问题,请将其输入终端(每个会话只需执行一次):

xhost +

您应该会收到一条消息,表明它已成功。我不记得确切的信息,但它是这样的:

Clients are now allowed to connect from any host.

发生的事情(假设我是正确的xhost)是SDL_SetVideoMode()调用失败并返回NULL,因为 Xorg 拒绝了连接。由于您没有对此进行检查,因此SDL_Flip()结束了对NULL指针的取消引用——因此出现了段错误。


旁注:您的代码中有一个错误,但是 --- 即,您不应该调用SDL_FreeSurface(screen);; 该特定表面是特殊的,并且会SDL_Quit();自动释放。来源(参见“返回值”部分):http ://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlsetvideomode.html

于 2015-02-10T01:49:27.353 回答
0

在 valgrind 下运行它。或 GDB。或您选择的其他调试器。

您可能应该成功地为屏幕分配内存。

于 2015-02-09T19:38:08.517 回答
0

检查是否SDL_SetVideoMode()失败!

screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
if (screen == NULL) /* error  */;
于 2015-02-09T19:39:20.587 回答