[T]
是dynamically sized type (DST).正如您已经怀疑的那样,指向DST的指针是包含长度的胖指针.
您的示例(简化为使用i32
而不是T
)
fn main() {
let l = std::alloc::Layout::array::<i32>(10).unwrap();
let a = std::alloc::alloc(l) as *mut [i32];
}
Demo个
将在编译时失败,并显示以下非常有用的错误:
error[E0607]: cannot cast thin pointer `*mut u8` to fat pointer `*mut [i32]`
--> src/main.rs:5:9
|
5 | let a = std::alloc::alloc(l) as *mut [i32];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
For more information about this error, try `rustc --explain E0607`.
这正好证明了这一点.
从细指针创建切片的示例如下所示:
fn main() {
let layout = std::alloc::Layout::array::<i32>(10).unwrap();
let slice = unsafe {
let ptr = std::alloc::alloc(layout) as *mut i32;
std::ptr::write_bytes(ptr, 0u8, 10); // initialize memory
std::slice::from_raw_parts(ptr, 10)
};
println!("{:?}", slice);
}
Demo个