Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpUsPt 117 of 288 menu
◀ ▶

Сырой указатель на число в 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 не вышла из области видимости.

Скажите, какую проверку срока жизни не выполняет сырой указатель по сравнению с обычной ссылкой на то же число.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить