Rust 如何转换Vec<;T>;变成一个C-友好的*mut T?

Rust 如何转换Vec<;T>;变成一个C-友好的*mut T?,rust,ffi,Rust,Ffi,我有一个Rust库,它通过FFI将u8数组返回给C调用方。库还处理在客户端使用完阵列后删除阵列的操作。库没有状态,因此客户端需要拥有阵列,直到它被传递回库释放 使用box::from_raw和boxed::into_raw会很好,但我无法解决如何将数组转换为返回类型。AVec由3个值描述: 指向其第一个元素的指针,可通过 一个长度,可以通过 可通过以下方式获得的容量: 对于C数组,容量是分配的内存大小,而长度是数组中实际包含的元素数。两者都在计数T。您通常需要向C代码提供这3个值 如果希望它

我有一个Rust库,它通过FFI将
u8
数组返回给C调用方。库还处理在客户端使用完阵列后删除阵列的操作。库没有状态,因此客户端需要拥有阵列,直到它被传递回库释放

使用
box::from_raw
boxed::into_raw
会很好,但我无法解决如何将数组转换为返回类型。

A
Vec
由3个值描述:

  • 指向其第一个元素的指针,可通过
  • 一个长度,可以通过
  • 可通过以下方式获得的容量:
对于C数组,容量是分配的内存大小,而长度是数组中实际包含的元素数。两者都在计数
T
。您通常需要向C代码提供这3个值

如果希望它们相等,可以根据分配器对向量使用以尽可能减小其容量

如果您将
Vec
的所有权返还给您的C代码,那么在检索到前面描述的3个值后,不要忘记调用
std::mem::forget(v)
,以避免其析构函数在函数末尾运行

之后,您可以使用以下方法从这3个值创建一个
Vec

let v = unsafe { Vec::<T>::from_raw_parts(ptr, length, capacity) };
let v=unsafe{Vec:::来自原始零件(ptr、长度、容量)};

当它的析构函数运行时,内存将被正确释放。请小心,这3个值必须正确,才能正确释放内存。这对于
Vec
来说不是很重要,但是
Vec
的析构函数将根据其
长度运行其包含的所有数据的析构函数。您好,感谢您的详细回复。它帮助我找到了一个可以接受的问题解决方案:为了从
Vec
获取一个c友好指针(自包含),我使用了概述的方法以及古老的c技巧,在数据之前打包必要的元数据,并将正确的偏移量指针返回给c调用方。删除内存是通过颠倒过程来完成的。请参阅我对已接受答案的评论。我已推迟将答案标记为已接受,直到我确信我的实现不会导致无效的内存操作。