Rust 的裸指针(*const T 和 *mut T)提供了一系列方法,主要分为创建方法 、判断与转换方法 和指针运算方法 。几乎所有方法的使用都离不开 unsafe 块,因为编译器无法保证其安全性。
我把这些方法整理成了分类表格,方便你快速查阅:
| 类别 | 方法名 | 说明 |
|---|---|---|
| 创建 | 引用强制转换 | &my_var 或 &mut my_var 直接转换 |
Box::into_raw |
消费一个 Box,返回其拥有的裸指针 |
|
ptr::addr_of! / addr_of_mut! |
安全地创建指向可能未对齐字段的指针 | |
&raw const / &raw mut |
与 addr_of! 功能相同的运算符写法(较新) |
|
| 外部函数接口 (FFI) | 从 C 代码等外部来源获取指针 | |
| 判断与转换 | is_null |
检查指针是否为空 |
cast<U> |
将指针类型转换为指向 U 的指针 |
|
as_ref / as_mut |
不安全 地将裸指针转换为 Option<&T> 或 Option<&mut T> |
|
as_ref_unchecked |
不安全地将裸指针直接转为引用,不做空值检查 | |
| 指针运算 | offset / add / sub |
不安全 地按 T 的大小进行加减运算,需保证不越界 |
wrapping_offset |
安全地进行指针加减运算(允许结果溢出),但解引用仍需 unsafe |
|
offset_to |
计算两个指针间的距离(以 T 为单位) |
⚠️ 关键注意事项
使用这些方法时,有几点需要特别留意:
- 一切皆在
unsafe之下 :解引用裸指针(使用*运算符)以及很多方法(如as_ref,offset)都是不安全的操作,必须放在unsafe块中执行。 - 生命周期的'陷阱' :通过
as_ref等方法将裸指针转换为引用时,Rust 会为其分配一个任意选择的'a生命周期。这个生命周期并不一定反映数据的实际存活时间,需要你自行保证转换后引用的使用不会超出数据的实际生命周期,否则会引发未定义行为。 - 关于
addr_of!:在 Rust 中,创建指向一个可能未对齐的字段的引用本身就是未定义行为。addr_of!(以及&raw const)宏就是为了解决这个问题而存在的,它允许你直接获取该字段的地址,而不经过创建引用的步骤。 - 指针有效性:确保指针非空、指向有效内存且字节对齐,是开发者自己的责任。即使对零大小类型进行访问,空指针也是无效的。
你是想了解特定的某个方法,还是正在编写 unsafe 代码碰到了实际问题?如果能说明具体场景,我可以帮你分析得更深入一些。