我正在尝试在 Rust 中实现一个双重链表以获得乐趣。
我面临着所有权制度的问题,无法为两个指针指定别名。我意识到指针混叠的好处,但这次我想破例。
我想知道是否有任何方法可以让两个*mut A
指针指向同一个内存地址。
例如,现在我有这个:
self.first = unsafe { mem::transmute(new_node) };
// How do I set self.last to point at the same new_node?
我知道Rc
和RefCell
类型,但我想避免在数据结构中使用它们,因为它们具有运行时开销。
虽然我同意 dbaupp,您应该提供更多上下文,因为这不是您应该做的,但这是您提出的确切问题的答案:
fn main() {
let mut a: u32 = 42;
let b: *mut u32 = &mut a;
let c: *mut u32 = &mut a;
println!("{:?}, {:?}", b, c);
}
现在,您有两个指向同一内存地址的*mut u32
指针。没有unsafe
!当然,如果你想使用指针,你现在必须做更多的思考,以确定你是否完全打破了编译器期望的所有假设和保证!:-)
我不确定你的意思。 &mut
是具有别名强制执行的那个。 *mut
可以像其他任何东西一样复制,取消引用原始指针当然是unsafe
,但您应该能够这样做:
fn main() {
let mut x: i32 = 5i32;
let xptr: *mut i32 = &mut x as *mut i32;
let xptr_copy: *mut i32 = xptr;
unsafe {
println!("xptr: {}", *xptr);
println!("xptr_copy: {}", *xptr_copy);
}
}
婴儿用围栏