You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Rust中将*mut T转换为*mut [T]?

如何在Rust中将mut T转换为mut [T]?

好问题!我之前也在这个点上卡过一会儿,其实解决方法很直接,只是可能因为函数所在的模块容易被忽略,才没第一时间找到。

首先给你最直接的方案:用标准库的std::ptr::slice_from_raw_parts_mut函数,它就是专门用来把单个元素的裸指针和长度组合成切片裸指针的。

代码示例

use std::ptr;

// 注意:这个函数标记为unsafe,因为调用者必须保证传入的指针和长度是合法的
unsafe fn single_ptr_to_slice_ptr<T>(data: *mut T, len: usize) -> *mut [T] {
    ptr::slice_from_raw_parts_mut(data, len)
}

为什么这个可行?

和你拆分*mut [T]的逻辑刚好相反:*mut [T]本质上就是一个包含“指向首元素的指针”和“长度”的结构体,slice_from_raw_parts_mut就是直接把这两个值打包成对应的裸指针类型,完全不需要经过引用的中间步骤,高效又直接。

如果你想手动实现(或者理解原理)

如果出于某些原因你不想用上面的专用函数,也可以先通过std::slice::from_raw_parts_mut创建切片引用,再把引用转换成裸指针——毕竟Rust里引用和同类型的裸指针是可以直接转换的:

unsafe fn single_ptr_to_slice_ptr<T>(data: *mut T, len: usize) -> *mut [T] {
    // 先创建可变切片引用
    let slice_ref = std::slice::from_raw_parts_mut(data, len);
    // 把引用直接转成裸指针
    slice_ref as *mut [T]
}

必须注意的安全事项

不管用哪种方法,你都必须遵守这些规则,否则会触发未定义行为

  • 传入的*mut T必须是有效的,并且它的溯源(provenance)必须覆盖整个切片的所有元素(这一点你已经确认过,非常关键)。
  • 传入的长度len必须准确对应实际可用的元素数量,不能超过内存中实际存在的元素个数。
  • 确保这段内存没有被其他地方非法修改或释放,直到你不再使用这个切片指针。

为什么之前没找到?

你说查slice和指针的文档没找到,大概率是因为这个函数在std::ptr模块里,而不是slice模块——我当初也是翻了好一会儿才发现它藏在这儿😅

这样应该就解决你的问题了,有其他疑问随时问!

火山引擎 最新活动