`*mut [T]`和`*mut T`的区别

问题描述 投票:0回答:1

我注意到

*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

pointers rust
1个回答
0
投票

[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

这很好地证明了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.