我注意到
*mut [T]
有一个 len()
方法。所以这意味着 *mut [T]
期望指向某个包含数组长度和实际数组的内存位置的指针,对吗?因此我不能简单地在两种类型之间进行转换?或者 *mut [T]
是一个胖指针(因此长度不存储在指针后面,而是存储在指针的一部分)?例如,这合法吗?
let l = Layout::array::<T>(size).unwrap();
let a = std::alloc::alloc(new_layout) as *mut [T];
或者我应该使用
*mut T
?
[T]
是动态调整大小的类型 (DST)。正如您已经怀疑的那样,指向 DST 的指针是包含长度的胖指针。
您的示例(简化为使用 i32
而不是 T
)
use std::alloc::Layout;
fn main() {
let l = Layout::array::<i32>(10).unwrap();
let a = std::alloc::alloc(l) as *mut [i32];
}
将在编译时失败,并出现以下非常有用的错误:
Compiling playground v0.0.1 (/playground)
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`.
error: could not compile `playground` (bin "playground") due to previous error
这很好地证明了这一点。