本文简要介绍rust语言中 Primitive Type pointer
的用法。
原始的、不安全的指针 *const T
和 *mut T
。
在 Rust 中使用原始指针并不常见,通常仅限于几种模式。原始指针可以是未对齐的或 null
。但是,当取消引用原始指针(使用 *
运算符)时,它必须是非空的并且是对齐的。
使用 *ptr = data
通过原始指针存储会在旧值上调用 drop
,因此如果类型已删除胶水且内存尚未初始化,则必须使用 write
- 否则将在未初始化的内存上调用 drop
。
使用 null
和 null_mut
函数创建空指针,并使用*const T
和*mut T
类型的 is_null
方法检查空指针。 *const T
和 *mut T
类型还为指针数学定义了 offset
方法。
创建原始指针的常用方法
1. 强制引用 (&T
) 或可变引用 (&mut T
)。
let my_num: i32 = 10;
let my_num_ptr: *const i32 = &my_num;
let mut my_speed: i32 = 88;
let my_speed_ptr: *mut i32 = &mut my_speed;
要获取指向装箱值的指针,请取消引用该框:
let my_num: Box<i32> = Box::new(10);
let my_num_ptr: *const i32 = &*my_num;
let mut my_speed: Box<i32> = Box::new(88);
let my_speed_ptr: *mut i32 = &mut *my_speed;
这不获取原始分配的所有权,并且以后不需要资源管理,但您不能在其生命周期后使用指针。
2.消耗一个盒子(Box<T>
)。
into_raw
函数使用一个盒子并返回原始指针。它不会破坏 T
或释放任何内存。
let my_speed: Box<i32> = Box::new(88);
let my_speed: *mut i32 = Box::into_raw(my_speed);
// By taking ownership of the original `Box<T>` though
// we are obligated to put it together later to be destroyed.
unsafe {
drop(Box::from_raw(my_speed));
}
请注意,这里对 drop
的调用是为了清楚起见——它表明我们已经完成了给定的值,应该将其销毁。
3.使用ptr::addr_of!
创建它
您可以使用宏 ptr::addr_of!
(用于*const T
)和 ptr::addr_of_mut!
(用于*mut T
),而不是强制引用原始指针。这些宏允许您创建指向无法创建引用的字段的原始指针(不会导致未定义的行为),例如未对齐的字段。如果涉及打包结构或未初始化的内存,这可能是必要的。
#[derive(Debug, Default, Copy, Clone)]
#[repr(C, packed)]
struct S {
aligned: u8,
unaligned: u32,
}
let s = S::default();
let p = std::ptr::addr_of!(s.unaligned); // not allowed with coercion
4. 从 C 中获取。
extern crate libc;
use std::mem;
unsafe {
let my_num: *mut i32 = libc::malloc(mem::size_of::<i32>()) as *mut i32;
if my_num.is_null() {
panic!("failed to allocate memory");
}
libc::free(my_num as *mut libc::c_void);
}
通常你不会从字面上使用 Rust 中的 malloc
和 free
,但是 C API 通常会分发大量指针,因此是 Rust 中原始指针的常见来源。
相关用法
- Rust pointer.offset_from用法及代码示例
- Rust pointer.is_null用法及代码示例
- Rust pointer.add用法及代码示例
- Rust pointer.get_unchecked用法及代码示例
- Rust pointer.align_offset用法及代码示例
- Rust pointer.wrapping_add用法及代码示例
- Rust pointer.wrapping_offset用法及代码示例
- Rust pointer.wrapping_sub用法及代码示例
- Rust pointer.as_uninit_ref用法及代码示例
- Rust pointer.len用法及代码示例
- Rust pointer.get_unchecked_mut用法及代码示例
- Rust pointer.sub用法及代码示例
- Rust pointer.set_ptr_value用法及代码示例
- Rust pointer.as_ptr用法及代码示例
- Rust pointer.as_mut_ptr用法及代码示例
- Rust pointer.offset用法及代码示例
- Rust pointer.as_mut用法及代码示例
- Rust pointer.as_ref用法及代码示例
- Rust poll_fn用法及代码示例
- Rust park用法及代码示例
- Rust panicking用法及代码示例
- Rust panic用法及代码示例
- Rust println用法及代码示例
- Rust pending用法及代码示例
- Rust print用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Primitive Type pointer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。