Pointers 在Rust中使用显式注释取消对原始指针的引用

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)

我正在编写不安全的代码片段,以模拟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);
        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