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
相关产品推荐
相关产品推荐

