Rust предоставляет необработанные указатели , *const T
и *mut T
для этой цели.Вы можете преобразовать usize
в эти типы, а затем разыменовать или создать ссылку Rust на это значение в небезопасном блоке.
Ссылки Rust автоматически гарантируют, что они всегда действительны.т. е. если вы используете один из них в безопасном Rust, то значение, на которое он ссылается, всегда будет правильно инициализировано и не будет отброшено.Как только вы разберетесь с необработанными указателями и адресами памяти, вы сами отвечаете за это, и вы можете вызвать некоторые довольно серьезные проблемы, если ошибитесь.
Если у вас есть значение в стеке, вы можете получить его следующим образомthis:
fn main() {
let my_value = 123;
// get a reference to the value
let my_value_ref = &my_value;
// convert the reference to a raw pointer
let my_value_raw_ptr = my_value_ref as *const i32;
// convert the raw pointer to an integer
let my_value_addr = my_value_raw_ptr as usize;
println!("address = {:X}", my_value_addr);
}
Если значение выделено в куче, то обычно есть метод для получения необработанного указателя.Например, Box
и Rc
имеют метод into_raw()
, в то время как String
и Vec
имеют as_ptr()
:
fn main() {
let my_vec = vec![1, 2, 3];
// get a raw pointer pointer to the data
let my_vec_ptr = my_vec.as_ptr();
// convert the raw pointer to an integer
let my_vec_addr = my_vec_ptr as usize;
println!("address = {:X}", my_vec_addr);
}
Получение такого адреса абсолютно безопасно.Тем не менее, вам нужно будет использовать unsafe
Rust, чтобы сделать что-нибудь полезное с ним.Вам будет необходимо убедиться, что значение по этому адресу является действительным при каждом обращении к нему.