gpt4 book ai didi

reference - 在 Rust 中传递内存地址

转载 作者:行者123 更新时间:2023-11-29 08:28:23 26 4
gpt4 key购买 nike

我有一个需要传递内存地址的函数。我只设法发现我们可以使用 println!("{:p}", number); 打印出内存地址。

如何访问内存地址并在函数中使用它?

最佳答案

Rust 提供 raw pointers , *const T*mut T 用于此目的。您可以将 usize 转换为这些类型,然后在不安全 block 中取消引用或创建对该值的 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 才能真正用它做任何有用的事情。您需要确保该地址的值无论何时被访问都是有效的。

关于reference - 在 Rust 中传递内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com