Pointers 在Rust中使用显式注释取消对原始指针的引用
我正在编写不安全的代码片段,以模拟C如何为Pointers 在Rust中使用显式注释取消对原始指针的引用,pointers,memory-management,rust,unsafe-pointers,Pointers,Memory Management,Rust,Unsafe Pointers,我正在编写不安全的代码片段,以模拟C如何为int分配内存。代码为isize类型分配内存,将0分配给指针变量,然后每秒无限递增地址处的值 use std::process; use std::{thread, time}; use std::alloc::{alloc, Layout}; fn main() { unsafe { let layout = Layout::new::<isize>(); let p = alloc(layout)
int
分配内存。代码为isize
类型分配内存,将0
分配给指针变量,然后每秒无限递增地址处的值
use std::process;
use std::{thread, time};
use std::alloc::{alloc, Layout};
fn main() {
unsafe {
let layout = Layout::new::<isize>();
let p = alloc(layout);
println!("({}) address pointed to by p: {:p}", process::id(), p);
*(p as *mut isize) = 0;
loop {
thread::sleep(time::Duration::from_millis(1000));
*(p as *mut isize) += 1;
println!("({}) p: {}", process::id(), *(p as *mut isize));
}
}
}
使用std::process;
使用std::{thread,time};
使用std::alloc::{alloc,Layout};
fn main(){
不安全{
让布局=布局::新建::();
设p=alloc(布局);
println!(“({})由p:{:p}”指向的地址,进程::id(),p);
*(p为*mut isize)=0;
环路{
线程::睡眠(时间::持续时间::from_millis(1000));
*(p为*mut isize)+=1;
println!(“({})p:{}”,process::id(),*(p as*mut isize));
}
}
}
然而,对于每个
*(p作为*mut size)
我可以用*p
替换,而不需要编译器抱怨(即*p=0;
),因此我假设它是正确推断的。我需要帮助解释差异,在这种情况下,可能需要显式类型注释。推断不正确。返回指向u8
的指针,该指针可以设置为0或递增,因此编译器不会抱怨。但是,它将在255处换行,而不是在4G处换行(如果您使用的是64位系统,也可以使用其他方式)。如果您想知道编译器为变量推断的类型,只需将let()=variable代码>某处。谢谢@SebastianRedl