我知道我们可以从引用->原始指针->地址(usize
),但我们可以做反向特别是与生命周期注释?例如,我有以下代码:
struct Name<'a> {
name: &'a str,
}
impl<'a> Name<'a> {
fn to_addr<'b>(&'b self) -> usize { /* ... */ }
fn from_addr<'b>(address: usize) -> &'b Name<'a> {
// assuming the address is valid,
// is this even possible to return an reference with both lifetimes?
}
}
这是unsafe
,但是是的:
fn from_addr<'b>(address: usize) -> &'b Name<'a> {
unsafe { &*(address as *const Self) }
}
你必须自己确保Rust的内存安全要求:指针必须是非空的,非悬空的,对齐的,不可变别名的,等等,确保生命周期是正确的。
我实际上将整个函数标记为unsafe
,因为生命周期'b
(取决于使用'a
)是在调用站点确定的。调用者应该知道,为了安全地使用它,它需要确保一些保证。
unsafe fn from_addr<'b>(address: usize) -> &'b Name<'a> {
&*(address as *const Self)
}