C和xlib:在一个非常简单的程序中XPending()崩溃

C和xlib:在一个非常简单的程序中XPending()崩溃,c,crash,xlib,C,Crash,Xlib,我是xlib的初学者。基于以下示例,我尝试使用select()编写Xwindow应用程序: 但是上面提到的代码在XPending函数中崩溃。因此,我试图隔离问题,在我的系统上,从我的观点来看,甚至这个非常简单的例子在第28行崩溃。由于一些测试,我假设is通过调用XFlush()在内部崩溃。在标有“//的行中,我已经解决了这个问题。尽管我不明白它为什么有效: 我没有使用全局ev变量,而是在主函数体中声明了它: XKeyEvent *ev = (XKeyEvent*) malloc(sizeof(X

我是xlib的初学者。基于以下示例,我尝试使用select()编写Xwindow应用程序:


但是上面提到的代码在XPending函数中崩溃。因此,我试图隔离问题,在我的系统上,从我的观点来看,甚至这个非常简单的例子在第28行崩溃。由于一些测试,我假设is通过调用XFlush()在内部崩溃。在标有“//的行中,我已经解决了这个问题。尽管我不明白它为什么有效:

我没有使用全局ev变量,而是在主函数体中声明了它:

XKeyEvent *ev = (XKeyEvent*) malloc(sizeof(XKeyEvent));
并将其指针性质调整为程序。

XKeyEvent的字节数大于XEvent 当您收到更大的事件时,ev变量将溢出。 使用malloc,实际得到的字节数比要求的多,从而解决了问题。 更好的解决方案是使用XEvent ev

XEvent ev;
...
XNextEvent( & ev );
...
printf( "%d\n", ev.xkey.keycode
))

XEvent ev;
...
XNextEvent( & ev );
...
printf( "%d\n", ev.xkey.keycode