Function std::ptr::write_bytes1.0.0[][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

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

  • dst 对于 count * size_of::<T>() 字节的写入,必须为 有效 的。

  • 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); // ERROR

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

// 实际上,根据基本类型布局不变式,`v` 无效,因此触摸它的 *any* 操作是未定义的行为。
// let v2 = v; // ERROR

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

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