Я писал небезопасный фрагмент кода, чтобы эмулировать, как 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;
), поэтому я предположил, что это было правильно выведено.Мне нужна помощь, чтобы объяснить разницу и в каком случае может потребоваться явная аннотация типа.