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

如何从Rust的Vec<[f32;3]>获取*mut f32类型的原始指针?

Rust中Vec<[f32;3]>转*mut f32对接C库的正确方式

因为Rust里Vec<[f32;3]>的内存布局是连续的——每个[f32;3]元素紧挨着存放,整个Vec的内存本质就是一段连续的3*N个f32值,所以你只需要把现有指针做类型转换就能满足C库的要求。

实现代码

let mut coords: Vec<[f32;3]> = vec![[0.0,0.0,0.0]; N];
// 将指向数组的指针转换为指向f32的原始指针
let flat_ptr = coords.as_mut_ptr() as *mut f32;
// 调用C函数包装器
wrapped_c_function(flat_ptr, 3 * N);

关键说明

  • 类型转换的合理性:coords.as_mut_ptr()返回的是*mut [f32;3],指向Vec的第一个数组元素。由于每个[f32;3]在内存中是连续的3个f32值,这个指针的地址和第一个f32值的地址完全重合,因此可以安全地转换为*mut f32。
  • 内存安全注意:必须保证在C函数执行期间,coords不会被销毁、重新分配或修改长度——否则会产生悬垂指针,导致未定义行为。
  • 对齐问题:f32的对齐要求和[f32;3]的对齐要求一致,所以转换后的指针符合C库对内存对齐的预期,无需额外处理。

另一种等价写法

你也可以通过切片来获取指针,效果完全相同:

let flat_ptr = coords.as_mut_slice().as_mut_ptr() as *mut f32;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:30:56