You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内存分配时*mut [T]与*mut T的差异及合法用法问询

关于Rust中*mut [T]指针的疑问解答

核心结论:*mut [T]是胖指针

*mut [T]属于胖指针,它自身包含两个部分:

  • 数组起始位置的内存地址
  • 数组的元素个数(长度)

也就是说,长度是存储在指针自身结构里,而非指针指向的内存区域中。这和仅存储内存地址的*mut T(瘦指针)有本质区别。

代码合法性分析

你给出的这段代码不合法:

let l = Layout::array::<T>(size).unwrap();
let a = std::alloc::alloc(new_layout) as *mut [T];

原因是std::alloc::alloc返回的是*mut u8类型的瘦指针,直接强制转换为*mut [T]时,胖指针的长度部分会是未定义的垃圾值,后续调用len()或进行内存操作都会触发未定义行为。

正确处理方式

如果要手动分配数组内存,正确步骤如下:

  1. 通过Layout::array::<T>(size)获取合法布局,调用alloc得到*mut u8起始指针
  2. 将其转换为*mut T类型的瘦指针(指向数组首个元素)
  3. 用std::ptr::slice_from_raw_parts_mut函数,把*mut T和长度组合成合法的*mut [T]胖指针

示例代码:

use std::alloc::{alloc, Layout};
use std::ptr;

fn allocate_array<T>(size: usize) -> *mut [T] {
    let layout = Layout::array::<T>(size).unwrap();
    let ptr = alloc(layout) as *mut T;
    ptr::slice_from_raw_parts_mut(ptr, size)
}

若你仅需要指向数组起始位置的指针,直接使用*mut T即可——它更轻便,无需管理胖指针的额外信息。


内容的提问来源于stack exchange,提问作者alagris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:57:12