本文簡要介紹rust語言中 Function core::ptr::write_bytes
的用法。
用法
pub unsafe fn write_bytes<T>(dst: *mut T, val: u8, count: usize)
將從 dst
開始的 count * size_of::<T>()
字節內存設置為 val
。
write_bytes
類似於 C 的 memset
,但將 count * size_of::<T>()
字節設置為 val
。
安全性
如果違反以下任何條件,則行為未定義:
-
對於
count * size_of::<T>()
字節的寫入,dst
必須是 valid。 -
dst
必須正確對齊。
此外,調用者必須確保將 count * size_of::<T>()
字節寫入給定的內存區域會產生 T
的有效值。使用類型為 T
且包含無效值 T
的內存區域是未定義的行為。
請注意,即使有效複製的大小 ( count * size_of::<T>()
) 是 0
,指針也必須非空且正確對齊。
例子
基本用法:
use std::ptr;
let mut vec = vec![0u32; 4];
unsafe {
let vec_ptr = vec.as_mut_ptr();
ptr::write_bytes(vec_ptr, 0xfe, 2);
}
assert_eq!(vec, [0xfefefefe, 0xfefefefe, 0, 0]);
創建無效值:
use std::ptr;
let mut v = Box::new(0i32);
unsafe {
// Leaks the previously held value by overwriting the `Box<T>` with
// a null pointer.
ptr::write_bytes(&mut v as *mut Box<i32>, 0, 1);
}
// At this point, using or dropping `v` results in undefined behavior.
// drop(v); // ERROR
// Even leaking `v` "uses" it, and hence is undefined behavior.
// mem::forget(v); // ERROR
// In fact, `v` is invalid according to basic type layout invariants, so *any*
// operation touching it is undefined behavior.
// let v2 = v; // ERROR
unsafe {
// Let us instead put in a valid value
ptr::write(&mut v as *mut Box<i32>, Box::new(42i32));
}
// Now the box is fine
assert_eq!(*v, 42);
相關用法
- Rust write_volatile用法及代碼示例
- Rust write_unaligned用法及代碼示例
- Rust write用法及代碼示例
- Rust writeln用法及代碼示例
- Rust UdpSocket.set_multicast_loop_v6用法及代碼示例
- Rust i64.overflowing_add_unsigned用法及代碼示例
- Rust Box.downcast用法及代碼示例
- Rust BTreeMap.last_key_value用法及代碼示例
- Rust str.make_ascii_uppercase用法及代碼示例
- Rust u128.checked_pow用法及代碼示例
- Rust usize.wrapping_mul用法及代碼示例
- Rust AtomicU8.fetch_sub用法及代碼示例
- Rust PanicInfo.payload用法及代碼示例
- Rust MaybeUninit.assume_init_mut用法及代碼示例
- Rust String.try_reserve用法及代碼示例
- Rust Mutex.new用法及代碼示例
- Rust f32.exp用法及代碼示例
- Rust Result.unwrap_or_else用法及代碼示例
- Rust slice.sort_unstable_by_key用法及代碼示例
- Rust Formatter.precision用法及代碼示例
- Rust i128.log2用法及代碼示例
- Rust OsStr.to_ascii_uppercase用法及代碼示例
- Rust f32.hypot用法及代碼示例
- Rust RefCell.try_borrow_unguarded用法及代碼示例
- Rust i16.log10用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Function core::ptr::write_bytes。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。