Function std::ptr::write_bytes 1.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