You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:54:05