Rust 使用闭包从选项获取原始指针是否安全<&;T>;?

Rust 使用闭包从选项获取原始指针是否安全<&;T>;?,rust,Rust,我有一个选项,我希望有一个原始*常量,如果该选项为无,则该值为空。我想包装一个FFI调用,该调用使用指向已分配对象的指针 此外,我使用的FFI接口具有借用语义(我分配一些东西并传入指向它的指针),而不是所有权语义 extern“C”{ //参数可能为空 fn ffi_呼叫(*const T); } fn安全包装(选项:选项){ 设ptr:*常数T=???; 不安全{ffi_call(ptr)} } 我可以使用match语句来实现这一点,但该方法感觉非常冗长 让ptr=match opt{ 一些

我有一个
选项
,我希望有一个原始
*常量
,如果该选项为
,则该值为空。我想包装一个FFI调用,该调用使用指向已分配对象的指针

此外,我使用的FFI接口具有借用语义(我分配一些东西并传入指向它的指针),而不是所有权语义

extern“C”{
//参数可能为空
fn ffi_呼叫(*const T);
}
fn安全包装(选项:选项){
设ptr:*常数T=???;
不安全{ffi_call(ptr)}
}
我可以使用
match
语句来实现这一点,但该方法感觉非常冗长

让ptr=match opt{
一些(内部)=>内部为*const T,
None=>null(),
};
我还可以将引用映射到指针,然后使用
unwrap\u或

让ptr=opt.map(| inner | inner as*const T).unwrap_或(null());

但是,我担心指针在通过闭包时可能会失效。Rust是否保证最终指针将指向与原始引用相同的对象?如果
T
Copy
,这会有意义地改变语义吗?有没有更好的方法可以让我忽略呢?

是的,这是安全的。我会这样写:

use std::ptr;

fn safe_wrapper(opt: Option<&u8>) {
    let p = opt.map_or_else(ptr::null, |x| x);
    unsafe { ffi_call(p) }
}
此C函数借用了:

大小字符串长度(字符*)
两者都有一个指针。Rust通过清楚地描述什么是借款和什么是所有权转让来改善这种情况

这种代码是荒谬的;它没有定义泛型类型
T
,FFI函数无论如何也不能有泛型类型。

@Stargateur我最终将使用
unsafe
通过指针操纵
T
。此外,我使用的FFI接口具有借用语义(我分配一些东西并传递指向它的指针),而不是所有权语义,因此
&
似乎是比
Box
更好的选择。这个问题是关于构造指针的,这是一个安全的操作。我的主要问题是:如何确保生成的指针实际指向与引用相同的对象?
extern "C" {
    // Parameter may be null
    fn ffi_call(*const T);
}