这是为了传递给一个函数*mut T
pub unsafe fn a() {
std::ptr::write_volatile(&581684,1);
}
Run Code Online (Sandbox Code Playgroud)
这当然会导致
error[E0308]: mismatched types
--> src/lib.rs:2:30
|
2 | std::ptr::write_volatile(&581684,1);
| ^^^^^^^ types differ in mutability
|
= note: expected raw pointer `*mut _`
found reference `&{integer}`
Run Code Online (Sandbox Code Playgroud)
在一行中执行此操作的正确方法是什么?
您可以使用&mut 581684,将其转换为指针:
// write 581684_i32 on the stack and then overwrite it with 1_i32
std::ptr::write_volatile(&mut 581684 as *mut _, 1);
Run Code Online (Sandbox Code Playgroud)
但该代码非常可疑,因为它i32在堆栈上创建一个临时值,用 填充它581684,然后将其地址传递给 来write_volatile()填充它1。由于地址位于堆栈上,是在运行时选择的,并且没有任何特殊之处,因此根本没有必要只1在那里写入以丢弃该位置。
如果您的目的是将值 1 写入固定地址(可能是硬件观察到的地址),那么这&ADDRESS不是您想要的。相反,您应该使用as运算符将地址作为整数转换为指针,就像在 C 或 C++ 中所做的那样。假设你想写一个字节,它看起来像这样:
// store 1u8 at address 581684
std::ptr::write_volatile(581684 as *mut _, 1u8);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |