gpt4 book ai didi

rust - &mut unsafe {}和unsafe {&mut}有什么区别?

转载 作者:行者123 更新时间:2023-12-03 11:23:36 25 4
gpt4 key购买 nike

我想将*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{ }有什么区别?

最佳答案

它与unsafe本身无关,而与块边界有关。
&*ptr是一个“重新借用”,它只是要重新解释指向新表格的指针。因此,您获得了指向同一对象的不同类型的指针(一个原始指针和一个引用)。
&{*ptr}完全不同,因为{*ptr}将为force a copy [0](感谢@harmic进行采购):

Blocks are always value expressions and evaluate the last expression in value expression context. This can be used to force moving a value if really needed.



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

这些对象具有相同的值,因为一个对象的指针是另一对象的指针的副本,因此阅读似乎可以工作,但是书写却不能,因为...您书写的不是您想像的位置。

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

[0]通常来说是一个举动,但在这里您指向的是 usize,即Copy

关于rust - &mut unsafe {}和unsafe {&mut}有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61605289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com