Сырой указатель на число в Rust
Сырой указатель хранит адрес в памяти, но
не несет с собой проверку срока жизни,
как обычная ссылка. Тип *const i32
читает целое по адресу, а компилятор
не следит, живо ли еще значение за этим
адресом.
Взять адрес у живой переменной можно в
обычном коде через оператор & и
присвоить его полю сырого типа. Само
чтение по такому адресу разрешено только
внутри небезопасного блока, иначе сборка
не пройдет.
Классический пример с локальным числом и выводом на экран выглядит так:
fn main() {
let x = 7;
let p: *const i32 = &x;
unsafe {
println!("{}", *p);
}
}
Печатается 7, потому что указатель
взят у живой переменной x и чтение
происходит, пока x еще в области
видимости. Если бы имя уже исчезло, тот
же адрес стал бы ошибкой, хотя тип указателя
этого не показывает.
Можно сначала скопировать число в новую переменную внутри блока, а уже ее вывести:
fn main() {
let score = 20;
let raw: *const i32 = &score;
unsafe {
let taken = *raw;
println!("{}", taken);
}
}
Дано число:
let num = 11;
Создайте переменную с этим литералом,
запишите адрес в *const i32 и
выведите значение, прочитав его в
небезопасном блоке.
Дано число:
let num = 6;
Переменная k равна этому литералу.
Скажите, почему чтение по указателю на
k внутри блока дает корректный
результат, пока k не вышла из
области видимости.
Скажите, какую проверку срока жизни не выполняет сырой указатель по сравнению с обычной ссылкой на то же число.