Rust 如何暴露锈迹'Vec<;T>;`去外国金融机构?

Rust 如何暴露锈迹'Vec<;T>;`去外国金融机构?,rust,ffi,Rust,Ffi,我试图构造一对元素: 数组:*mut T T array\u len:usize 数组用于拥有数据 但是,将返回*mut[T]。我找不到任何有关将原始指针转换为切片的信息。它在内存中的布局是什么?如何从C使用它?我应该转换为*mut T?如果是,如何获取?您可以直接从Vec、框或任何其他切片类型获取*mut T指针 use std::mem; let mut boxed_slice: Box<[T]> = vector.into_boxed_slice(); let arra

我试图构造一对元素:

  • 数组:*mut T T
  • array\u len:usize
数组
用于拥有数据

但是,将返回
*mut[T]
。我找不到任何有关将原始指针转换为切片的信息。它在内存中的布局是什么?如何从C使用它?我应该转换为
*mut T
?如果是,如何获取?

您可以直接从
Vec
或任何其他切片类型获取
*mut T
指针

use std::mem;

let mut boxed_slice: Box<[T]> = vector.into_boxed_slice();

let array: *mut T = boxed_slice.as_mut_ptr();
let array_len: usize = boxed_slice.len();

// Prevent the slice from being destroyed (Leak the memory).
mem::forget(boxed_slice);
使用std::mem;
让mut boxed_slice:Box=vector.into_boxed_slice();
let数组:*mut T=box_slice.as_mut_ptr();
让数组_len:usize=boxed_slice.len();
//防止片被破坏(泄漏内存)。
mem::忘记(盒装切片);

如果您只想让某个C函数可变地借用
Vec
,您可以这样做:

extern "C" {
    fn some_c_function(ptr: *mut i32, len: ffi::size_t);
}

fn safe_wrapper(a: &mut [i32]) {
    unsafe {
        some_c_function(a.as_mut_ptr(), a.len() as ffi::size_t);
    }
}
use std::mem;

extern "C" {
    fn c_sink(ptr: *mut i32, len: ffi::size_t);
}

fn sink_wrapper(mut vec: Vec<i32>) {
    vec.shrink_to_fit();
    assert!(vec.len() == vec.capacity());
    let ptr = vec.as_mut_ptr();
    let len = vec.len();
    mem::forget(vec); // prevent deallocation in Rust
                      // The array is still there but no Rust object
                      // feels responsible. We only have ptr/len now
                      // to reach it.
    unsafe {
        c_sink(ptr, len as ffi::size_t);
    }
}
当然,C函数不应该将该指针存储在其他地方,因为这将打破别名假设

如果要将数据的所有权“传递”给C代码,可以执行以下操作:

extern "C" {
    fn some_c_function(ptr: *mut i32, len: ffi::size_t);
}

fn safe_wrapper(a: &mut [i32]) {
    unsafe {
        some_c_function(a.as_mut_ptr(), a.len() as ffi::size_t);
    }
}
use std::mem;

extern "C" {
    fn c_sink(ptr: *mut i32, len: ffi::size_t);
}

fn sink_wrapper(mut vec: Vec<i32>) {
    vec.shrink_to_fit();
    assert!(vec.len() == vec.capacity());
    let ptr = vec.as_mut_ptr();
    let len = vec.len();
    mem::forget(vec); // prevent deallocation in Rust
                      // The array is still there but no Rust object
                      // feels responsible. We only have ptr/len now
                      // to reach it.
    unsafe {
        c_sink(ptr, len as ffi::size_t);
    }
}

因为
Vec::from_raw_parts
需要三个参数,一个指针、一个大小和一个容量,所以我们要么以某种方式跟踪容量,要么在将指针和长度传递给C函数之前使用Vec的
shrink__fit
。不过,这可能涉及重新分配。

一旦
向量
被销毁,
数组
是否有效?这个想法是
array
将拥有数据(我将更新这个问题)。@vinipsmaker:不。因此,请不要让向量被
破坏,忘记它。请参阅更新。抱歉,我不知道在这种方法中释放代码是如何工作的<代码>放入已装箱的切片
将返回。。。内存中的布局是什么<代码>已装箱的切块。as_mut_ptr()保证返回指向第一个字符的指针吗?如何转换回
,以便取消分配?@vinipsmaker:(1)未指定布局。当前实现使用
(ptr,len)
。(2) 也许你应该问一个新问题。但是你可以尝试
slice::from_raw_parts_mut
Box::from_raw
,或者使用
Vec::from_raw_parts
,但是你也需要传递容量。在这里
slice::from_raw_parts
+
Box::from_raw
可以吗?
Box::from_raw
不是在获取指向堆栈分配的片而不是原始片的指针吗?或者
Box
是一个特例?这就是我最后使用的:。除了
断言,我正在考虑使用它,但我没有足够的信心/说服力。