當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。