Function std::intrinsics::write_bytes 1.0.0 (const: unstable)[−][src]
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