在 Rust 中传递内存地址

Dom*_*icz 4 reference memory-address rust

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

Pet*_*all 11

Rust 提供了原始指针*const T并且*mut T为此目的。您可以将 a 转换usize为这些类型,然后在 unsafe 块中取消引用或创建对该值的 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);
}
Run Code Online (Sandbox Code Playgroud)

如果该值是堆分配的,那么通常有一个提供的方法来获取原始指针。例如,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);
}
Run Code Online (Sandbox Code Playgroud)

像这样获取地址是完全安全的。但是,您将需要使用unsafeRust 来实际使用它来做任何有用的事情。确保该地址处的值在访问时有效,这取决于您。