在 Rust 中传递内存地址

Passing a memory address in Rust

我有一个函数需要传递内存地址。我只设法发现我们可以使用 println!("{:p}", number) 打印出一个内存地址。如何访问内存地址并在函数中使用它?

Rust 为此提供了 raw pointers*const T*mut T。您可以将 usize 转换为这些类型,然后在不安全块中取消引用或创建对该值的 Rust 引用。

Rust 引用自动确保它们始终有效。也就是说,如果你在安全的 Rust 中使用一个,那么它引用的值将始终被正确初始化,并且它不会被删除。一旦你处理了原始指针和内存地址,你就要自己负责,如果你弄错了,你可能会导致一些非常严重的问题。

如果栈上有值,可以这样获取:

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);
}

如果值是堆分配的,那么通常有提供的方法来获取原始指针。例如,BoxRc 有一个 into_raw() 方法,而 StringVecas_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 才能真正用它做任何有用的事情。由您来确保该地址的值无论何时被访问都是有效的。