Передача адреса памяти в Rust - PullRequest
1 голос
/ 19 сентября 2019

У меня есть функция, где мне нужно передать адрес памяти.Мне только удалось обнаружить, что мы можем распечатать адрес памяти, используя println! ("{: P}", number).Как я могу получить доступ к адресу памяти и использовать его в функции?

1 Ответ

1 голос
/ 19 сентября 2019

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, чтобы сделать что-нибудь полезное с ним.Вам будет необходимо убедиться, что значение по этому адресу является действительным при каждом обращении к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...