Rust调用timer_create等FFI函数时如何避免初始化输出参数为null_mut
解决方案
你可以使用Rust标准库提供的std::mem::MaybeUninit实现延迟初始化,完全避免无意义的null_mut()提前赋值。MaybeUninit是专门设计用来处理需要后续再完成初始化的场景,刚好适配C语言输出参数的使用习惯。
修改后的实现代码如下:
use std::mem::MaybeUninit; use std::ptr::null_mut; use libc::{CLOCK_MONOTONIC, timer_create, timer_delete, timer_t}; fn main() { // 声明未初始化的计时器ID变量,无需提前赋值 let mut timer1 = MaybeUninit::<timer_t>::uninit(); unsafe { let r = timer_create(CLOCK_MONOTONIC, null_mut(), timer1.as_mut_ptr()); if r == 0 { // 调用成功时,C API已经完成了变量写入,可安全读取有效值 let valid_timer = timer1.assume_init(); timer_delete(valid_timer); } } }
注意事项
- 只有确认
timer_create返回值为0、调用成功的情况下,才可以调用assume_init()读取值,这和你现有的返回值判断逻辑完全匹配 - 这种写法完全符合Rust的安全约定,语义上清晰标识了变量的初始化状态,相比提前赋值null的写法也没有多余的初始化开销
内容的提问来源于stack exchange,提问作者hdante
相关产品推荐
相关产品推荐

