在Rust中使用原始注释解引用原始指针

时间:2018-12-07 15:43:21

标签: 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);
        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));
        }
    }
}

但是,对于每个*(p as *mut size),我都可以用*p替换而不会引起编译器的抱怨(即*p = 0;),因此我认为它是正确推断的。我需要帮助来解释差异,在这种情况下,可能需要显式类型注释。

1 个答案:

答案 0 :(得分:1)

无法正确推断。 alloc返回指向u8的指针,该指针可以设置为0或递增,因此编译器不会抱怨。但是,它将以255封装,而不是4G封装(如果您使用的是64位系统,则可以封装)。