本文簡要介紹rust語言中 Macro std::ptr::addr_of_mut
的用法。
用法
pub macro addr_of_mut($place : expr) {
...
}
創建指向位置的mut
原始指針,而不創建中間引用。
創建參考&
/&mut
僅當指針正確對齊並指向初始化數據時才允許。對於不滿足這些要求的情況,應使用原始指針。然而,&mut expr as *mut _
在將其轉換為原始指針之前創建一個引用,並且該引用與所有其他引用遵循相同的規則。該宏可以創建一個原始指針沒有首先創建一個參考。
但是請注意,addr_of_mut!(expr)
中的expr
仍然遵守所有常規規則。特別是,addr_of_mut!(*ptr::null_mut())
是未定義行為,因為它取消引用空指針。
例子
創建指向未對齊數據的指針:
use std::ptr;
#[repr(packed)]
struct Packed {
f1: u8,
f2: u16,
}
let mut packed = Packed { f1: 1, f2: 2 };
// `&mut packed.f2` would create an unaligned reference, and thus be Undefined Behavior!
let raw_f2 = ptr::addr_of_mut!(packed.f2);
unsafe { raw_f2.write_unaligned(42); }
assert_eq!({packed.f2}, 42); // `{...}` forces copying the field instead of creating a reference.
創建指向未初始化數據的指針:
use std::{ptr, mem::MaybeUninit};
struct Demo {
field: bool,
}
let mut uninit = MaybeUninit::<Demo>::uninit();
// `&uninit.as_mut().field` would create a reference to an uninitialized `bool`,
// and thus be Undefined Behavior!
let f1_ptr = unsafe { ptr::addr_of_mut!((*uninit.as_mut_ptr()).field) };
unsafe { f1_ptr.write(true); }
let init = unsafe { uninit.assume_init() };
相關用法
- Rust addr_of_mut用法及代碼示例
- Rust addr_of用法及代碼示例
- Rust assert_ne用法及代碼示例
- Rust array.map用法及代碼示例
- Rust assert_matches用法及代碼示例
- Rust alloc_zeroed用法及代碼示例
- Rust array.split_array_ref用法及代碼示例
- Rust array用法及代碼示例
- Rust array.zip用法及代碼示例
- Rust align_of用法及代碼示例
- Rust always_abort用法及代碼示例
- Rust assert_eq用法及代碼示例
- Rust array.split_array_mut用法及代碼示例
- Rust available_parallelism用法及代碼示例
- Rust abort用法及代碼示例
- Rust align_of_val用法及代碼示例
- Rust array.each_mut用法及代碼示例
- Rust assert用法及代碼示例
- Rust array.each_ref用法及代碼示例
- Rust args用法及代碼示例
- Rust alloc用法及代碼示例
- Rust args_os用法及代碼示例
- Rust align_of_val_raw用法及代碼示例
- Rust UdpSocket.set_multicast_loop_v6用法及代碼示例
- Rust i64.overflowing_add_unsigned用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Macro std::ptr::addr_of_mut。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。