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