【发布时间】:2022-11-23 06:21:06
【问题描述】:
我可以像这样将 &mut 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。
但我无法将 &mut &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 的指针,但看起来这个转换是错误的。
为什么允许第一个演员表而不允许第二个演员表?
【问题讨论】:
-
你可以分两步完成
let xrefptr = (xrefref as *mut &mut i32) as *mut *mut i32; -
像这样的转换通常只能改变一个属性。例如,您可以将引用转换为指针,或更改指针的类型,但不能同时进行。
-
谢谢@isaactfa 我可以分两步完成演员表。请随意发布示例,我会接受。