这段代码是正确的:
fn f() {
let mut x = 11;
b(&x as *const u8 as *mut u8);
}
fn b(x: *mut u8) {}
为什么(&x as *const u8 as *mut u8)是有效的,而(&x as *mut u8)是无效的?编译器报错如下:
error[E0606]: 将
&u8
转换为*mut u8
是无效的
这段代码是正确的:
fn f() {
let mut x = 11;
b(&x as *const u8 as *mut u8);
}
fn b(x: *mut u8) {}
error[E0606]: 将
&u8
转换为*mut u8
是无效的
as
表达式的规则。引用自Nomicon:
使用转换不具有传递性,也就是说,即使
e as U1 as U2
是有效的 表达式,e as U2
未必是有效的。
as
运算符,您可以执行显式强制转换或类型转换。&u8
到*mut u8
的转换或强制转换。但是,存在从&T
到*const T
的指针弱化强制转换和从大小类型的指针到任何其他类型的强制转换。这两种组合会导致您提出的问题中的表达式。因为 Rust 引用是常量。
你想要做的是将可变引用 &mut x
转换为一个原始整数可变指针 *mut i32
。
这段代码是有效的:
let mut x = 42;
let ptr = &mut x as *mut _;
// equivalent to
let ptr_2 = &x as *const _ as *mut _;
&op_create as *const _ as *const _ as *mut u8
。 - Sven Marnach