【问题标题】:Pass mutable pointer to function without initializing it first将可变指针传递给函数而不先初始化它
【发布时间】:2022-01-05 10:23:24
【问题描述】:
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);
        }
    }
}

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

如果知道 API 保证它是安全的,我如何避免像上面的代码中那样将 timer1 初始化为 null_mut()

【问题讨论】:

    标签: rust ffi


    【解决方案1】:

    你可以使用MaybeUninit:

    use std::mem::MaybeUninit;
    use std::ptr::null_mut;
    
    use libc::{CLOCK_MONOTONIC, timer_create, timer_delete, timer_t};
    
    fn main() {
        let mut timer1 = MaybeUninit::<timer_t>::uninit();
        let timer1 = unsafe {
            let r = timer_create(CLOCK_MONOTONIC, null_mut(), timer1.as_mut_ptr());
            if r != 0 {
                panic!("…");
            }
            timer1.assume_init()
        };
        unsafe {
            timer_delete(timer1);
        }
    }
    

    【讨论】:

    • 请注意,这段代码更好,因为timer_t 是不透明类型。
    • 是的,就是这样。非常感谢,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多