我正在编写不安全的代码段,以模拟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;
),因此我认为它是正确推断的。我需要帮助来解释差异,在这种情况下,可能需要显式类型注释。
答案 0 :(得分:1)
无法正确推断。 alloc
返回指向u8
的指针,该指针可以设置为0或递增,因此编译器不会抱怨。但是,它将以255封装,而不是4G封装(如果您使用的是64位系统,则可以封装)。