我正在尝试在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
类型,但我想避免在数据结构中使用它们,因为它们有运行时开销。
答案 0 :(得分:1)
我不确定你的意思。 &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);
}
}
答案 1 :(得分:1)
虽然我同意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
!当然,如果你想使用指针,你现在必须做更多的思考来决定你是否完全打破了编译器所期望的所有假设和保证! : - )