首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铸造‘&mut &mut i32’as‘*mut *mut i 32`为什么无效?

铸造‘&mut &mut i32’as‘*mut *mut i 32`为什么无效?
EN

Stack Overflow用户
提问于 2022-11-22 21:58:54
回答 1查看 47关注 0票数 1

我可以用铁锈把i32铸造成*mut i32。

代码语言:javascript
复制
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,我也不明白为什么。

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
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指针的指针,但是这种转换似乎是错误的。

为什么第一个演员是允许的,而不是第二个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-22 22:20:07

正如@PitaJ所指出的那样,你通常一次只能做一次角色转换,而且转换不是传递性的。也就是说,T as U是有效的,U as V是有效的并不意味着T as V是有效的。

但是,您只需分两个步骤(在安全代码中!)完成强制转换:

代码语言:javascript
复制
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); // 2
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74539441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档