内存分配时*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()或进行内存操作都会触发未定义行为。
正确处理方式
如果要手动分配数组内存,正确步骤如下:
- 通过
Layout::array::<T>(size)获取合法布局,调用alloc得到*mut u8起始指针 - 将其转换为
*mut T类型的瘦指针(指向数组首个元素) - 用
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
相关产品推荐
相关产品推荐

