将可变指针传递给函数而不首先对其进行初始化

hda*_*nte 0 ffi rust

use std::ptr::{addr_of_mut, null_mut};

use libc::{CLOCK_MONOTONIC, timer_create, timer_delete, timer_t};

fn main() {
    let mut timer1: timer_t = null_mut();

    unsafe {
        let r = timer_create(CLOCK_MONOTONIC, null_mut(), addr_of_mut!(timer1));
        if r == 0 {
            timer_delete(timer1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

调用时timer_create(),生成的定时器 ID 存储在变量中timer1。我将它作为可变指针传递,因此这就是输出变量。

我怎样才能避免像上面的代码中timer1那样初始化null_mut(),因为知道 API 保证它是安全的?

Ry-*_*Ry- 5

您可以使用MaybeUninit

\n
use std::mem::MaybeUninit;\nuse std::ptr::null_mut;\n\nuse libc::{CLOCK_MONOTONIC, timer_create, timer_delete, timer_t};\n\nfn main() {\n    let mut timer1 = MaybeUninit::<timer_t>::uninit();\n    let timer1 = unsafe {\n        let r = timer_create(CLOCK_MONOTONIC, null_mut(), timer1.as_mut_ptr());\n        if r != 0 {\n            panic!("\xe2\x80\xa6");\n        }\n        timer1.assume_init()\n    };\n    unsafe {\n        timer_delete(timer1);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 请注意,此代码更好,因为“timer_t”是不透明类型。 (2认同)