【问题标题】:What's the difference between &mut unsafe { } and unsafe { &mut }?&mut unsafe { } 和 unsafe { &mut } 有什么区别?
【发布时间】:2020-05-05 03:32:15
【问题描述】:

我想将*mut 指针转换为&mut 引用。

// Both setting a value to ptr and getting a value from ptr succeeds.
let ptr: &mut usize = unsafe { &mut *(VIRTUAL_ADDRESS_TO_ACCESS_FREE_PAGE as *mut usize) };

这行得通。但是,如果 &mutunsafe 块之外,则代码将无法部分工作。 *ptr = foo 不会将foo 存储到内存ptr 点,但let foo = *ptr 会将*ptr 的值分配给foo

// Setting a value to ptr fails, but getting a value from ptr succeeds.
let ptr: &mut usize = &mut unsafe { *(VIRTUAL_ADDRESS_TO_ACCESS_FREE_PAGE as *mut usize) };

unsafe { &mut }&mut unsafe{ } 有什么区别?

【问题讨论】:

    标签: rust


    【解决方案1】:

    它与unsafe 本身没有任何关系,而是与块边界

    &*ptr 是一个“重新借用”,它只是重新解释指向新表单的指针。所以你会得到指向同一个对象的不同类型的指针(一个原始指针和一个引用)。

    &{*ptr} 完全不同,因为{*ptr}force a copy[0](感谢@harmic 提供):

    块始终是值表达式,并计算值表达式上下文中的最后一个表达式。如果确实需要,这可用于强制移动值。

    然后它将借用该副本。这意味着你得到两个指针指向完全不同的对象

    对象具有相同的值,因为一个指针是另一个指针的副本,因此 reading 似乎有效,但 writing 不起作用,因为... '没有写你认为你在哪里。

    请参阅this demonstration(不使用 mut 指针,因为无需演示该问题)


    [0] 更一般地说是一个移动,但在这里你指向的是一个 usize,它是 Copy

    【讨论】:

    • 可能值得添加一个指向here 的链接,其中说:“块始终是值表达式,并评估值表达式上下文中的最后一个表达式。如果确实需要,这可用于强制移动值。”
    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 2019-09-04
    • 1970-01-01
    • 2014-12-20
    • 2015-04-19
    • 2023-03-13
    • 2016-04-29
    • 2023-03-19
    相关资源
    最近更新 更多