You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何传递内存地址并在函数中使用?

在Rust中获取内存地址并传递给函数

嘿,我来帮你理清这个问题!在Rust里要获取变量的内存地址并传给函数,核心是用原始指针(raw pointers)——毕竟你已经知道用println!("{:p}", ...)能打印地址,那接下来就是把这个地址转成可传递的类型,再在函数里合理使用它。

步骤1:获取变量的内存地址(转成原始指针)

Rust里用&符号取变量的引用,再把引用强制转换成原始指针类型:

  • 对于不可变变量,转成*const T(只读原始指针)
  • 对于可变变量,转成*mut T(可写原始指针)

举个简单例子:

let number = 42;
// 获取不可变内存地址指针
let addr_ptr: *const i32 = &number as *const i32;

// 如果是可变变量
let mut mutable_num = 100;
let mutable_addr_ptr: *mut i32 = &mut mutable_num as *mut i32;

你可以用println!("{:p}", addr_ptr)验证,输出的地址和直接打印&number是完全一致的。

步骤2:把地址传递给函数并使用

如果你的函数需要接收内存地址,参数类型就定义成对应的原始指针。但要重点注意:操作原始指针属于unsafe操作——因为Rust无法保证这个指针指向的内存是有效的(比如变量已经被销毁、指针是空的),所以必须在unsafe块里解引用指针。

完整代码示例:

// 接收内存地址指针的函数
fn process_memory_address(ptr: *const i32) {
    unsafe {
        // 用as_ref()安全检查指针有效性,再解引用
        match ptr.as_ref() {
            Some(value) => println!("Value at address: {}", value),
            None => println!("Invalid pointer!"),
        }
    }
}

fn main() {
    let number = 42;
    // 获取内存地址指针
    let addr = &number as *const i32;
    
    println!("Memory address: {:p}", addr);
    // 把地址传给函数
    process_memory_address(addr);
}

额外情况:如果函数需要地址的数值(比如usize类型)

有些场景下函数可能需要的是地址的数值(比如用usize存储),你可以把原始指针转成usize:

let addr_num: usize = addr as usize;

之后如果要再转回指针,也可以强制转换:let ptr = addr_num as *const i32;,同样要确保这个数值对应的内存是有效的,且操作必须在unsafe块里执行。

重要提醒

  • 永远要保证原始指针指向的内存生命周期有效:如果变量被销毁(比如超出作用域),再用这个指针会导致未定义行为。
  • 尽量避免不必要的unsafe操作,Rust的引用系统是为了安全设计的,只有在确实需要直接操作内存时才用原始指针。

内容的提问来源于stack exchange,提问作者Dominika Kubicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:58:42