rust 如何将一个可变指针转换成一个内部带有ref的结构体?

v8wbuo2f  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(118)

如何简化这段代码(请不要问它是用来做什么的):

pub fn f<'a>(p: *mut Option<u64>) -> Option<&'a mut u64> {
    match unsafe { &mut *(p.add(5)) } {
        Some(p) => Some(p),
        None => None,
    }
}

我期望将指向Option的指针转换为内部带有引用的Option。它以这种方式完美地工作,但是有一个明显的冗余。我已经有了Option,创建一个新的是多余的步骤。我可以把指针转换成结构体吗?

bakd9h0s

bakd9h0s1#

首先,这个功能不安全。如果存在另一个对p + 5的引用,或者它不是一个初始化的或有效的Option<u64>,则不能调用它。
您可以简单地解引用该值,然后对其调用as_mut

pub unsafe fn f<'a>(p: *mut Option<u64>) -> Option<&'a mut u64> {
    (*p.add(5)).as_mut()
}

相关问题