当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust pointer用法及代码示例


本文简要介绍rust语言中 Primitive Type pointer 的用法。

原始的、不安全的指针 *const T*mut T

另请参阅std::ptr 模块.

在 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 中的 mallocfree,但是 C API 通常会分发大量指针,因此是 Rust 中原始指针的常见来源。

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Primitive Type pointer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。