Rust开发X11窗口管理器调用XNextEvent出现段故障如何解决
问题根因
你触发段错误的核心原因是XNextEvent传参不符合要求:XNextEvent的第二个入参需要指向已分配可写内存的XEvent结构体指针,函数会将读取到的事件数据写入该内存地址。你的代码直接将空指针(0 as *mut XEvent)传入,函数尝试向空地址写数据直接触发段错误,和libX11内部实现无关。
修复代码
正确的写法是先在栈上分配XEvent实例,再传入可变指针:
// event loop loop { // 预先在栈上分配XEvent内存,初始化为全0符合Xlib的使用要求 let mut event: XEvent = unsafe { std::mem::zeroed() }; unsafe { // 传入实例的可变裸指针,而非空指针 XNextEvent(DISPLAY, &mut event as *mut XEvent); match event.type_ { CreateNotify => { println!("sdfg"); } _ => { println!("sdfgsdfg"); } } } println!("dsfgsdfg"); }
补充注意事项
- 不需要手动创建空的裸指针再传入FFI函数,绝大部分C库的输出类型参数都要求调用方提前分配好对应内存
- 只要保证
DISPLAY指针是经过正确初始化的有效值,修复传参问题后就不会再在XNextEvent处触发段错误
内容的提问来源于stack exchange,提问作者ChromaCat248
相关产品推荐
相关产品推荐

