如何从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
相关产品推荐
相关产品推荐

