Function std::intrinsics::write_bytes1.0.0 (const: unstable)[][src]

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>() 字节写入给定的内存区域会导致 T 的有效值。 使用类型为 T 的内存区域包含无效的 T 值是未定义的行为。

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

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

创建一个无效值:

use std::ptr;

let mut v = Box::new(0i32);

unsafe {
    // 通过使用空指针覆盖 `Box<T>`,泄漏先前保留的值。
    ptr::write_bytes(&mut v as *mut Box<i32>, 0, 1);
}

// 此时,使用或丢弃 `v` 会导致未定义的行为。
// drop(v); // 错误

// 即使 `v` "uses" 泄漏了它,因此也是未定义的行为。
// mem::forget(v);  // 错误

// 事实上,根据原始类型布局不变性,`v` 是无效的,因此,任何触及它的操作都是未定义的行为。
// let v2 = v; // ERROR

unsafe {
    // 让我们输入一个有效值
    ptr::write(&mut v as *mut Box<i32>, Box::new(42i32));
}

// 现在 box 很好
assert_eq!(*v, 42);
Run