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


Rust write_bytes用法及代碼示例


本文簡要介紹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-lang.org大神的英文原創作品 Function core::ptr::write_bytes。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。