我可以用铁锈把i32铸造成*mut i32。
fn main() {
let mut x = 1;
let mut xref = &mut x;
unsafe {
let xref_ptr = xref as *mut i32;
*xref_ptr = 2;
}
println!("{}", x);
}指纹2。
但我不能把&‘t &mut i32投给*mut *mut i32,我也不明白为什么。
fn main() {
let mut x = 1;
let mut xref = &mut x;
let mut xrefref = &mut xref;
unsafe {
let xrefptr = xrefref as *mut (*mut i32);
**xrefptr = 2;
}
println!("{}", x);
}error[E0606]: casting `&mut &mut i32` as `*mut *mut i32` is invalid
--> src/main.rs:16:23
|
16 | let xrefptr = xrefref as *mut (*mut i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^如果引用是遮罩下的指针,我期望&mut &mut i32是指向i32指针的指针,但是这种转换似乎是错误的。
为什么第一个演员是允许的,而不是第二个?
发布于 2022-11-22 22:20:07
正如@PitaJ所指出的那样,你通常一次只能做一次角色转换,而且转换不是传递性的。也就是说,T as U是有效的,U as V是有效的并不意味着T as V是有效的。
但是,您只需分两个步骤(在安全代码中!)完成强制转换:
let mut x = 1;
let mut xref = &mut x;
let mut xrefref = &mut xref;
let xrefptr = (xrefref as *mut &mut i32) as *mut *mut i32;
unsafe {
**xrefptr = 2;
}
println!("{}", x); // 2https://stackoverflow.com/questions/74539441
复制相似问题