Function core::ptr::write_bytes

1.0.0 (const: unstable) · source ·
pub unsafe fn write_bytes<T>(dst: *mut T, val: u8, count: usize)
Expand description

将从 dst 开始的 count * size_of::<T>() 内存字节设置为 val

write_bytes 类似于 C 的 memset,但将 count * size_of::<T>() 字节设置为 val

Safety

如果违反以下任一条件,则行为是未定义的:

  • 对于 count * size_of::<T>() 字节的写入,dst 必须是 valid

  • dst 必须正确对齐。

请注意,即使有效复制的大小 (count * size_of::<T>()) 是 0,指针也必须非空的并且正确对齐。

此外,请注意,如果写入的字节不是某些 T 的有效表示,那么以这种方式更改 *dst 很容易导致 (UB) 以后出现未定义的行为。 例如,以下是此函数的不正确用法:

unsafe {
    let mut value: u8 = 0;
    let ptr: *mut bool = &mut value as *mut u8 as *mut bool;
    let _bool = ptr.read(); // 这很好,`ptr` 指向一个有效的 `bool`。
    ptr.write_bytes(42u8, 1); // 这个函数本身不会导致 UB...
    let _bool = ptr.read(); // ...但它使这个操作成为 UB! ⚠️
}
Run

Examples

基本用法:

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]);
Run