是否可以将数组从Rust传递给C?

时间:2018-03-31 19:39:08

标签: c rust ffi

我有一个非常基本的Rust函数编译好:

use std;
use std::ffi::CString;
use std::os::raw::c_char;

#[no_mangle]
pub extern "C" fn string_from_rust() -> [*const c_char; 2] {
    let s = CString::new("Hello").unwrap();
    let t = CString::new("World").unwrap();
    let p = s.as_ptr();
    let w = t.as_ptr();
    std::mem::forget(s);
    std::mem::forget(t);

    [p, w]
}

在我的C头文件中,我加入了

#include <stdint.h>
extern char * string_from_rust();

string_from_rust()只返回“Hello”,所以我似乎做错了,大概是在C中,只允许将Rust数组的第一个元素传递给C.

1 个答案:

答案 0 :(得分:1)

C ABI没有&#34;返回数组&#34;的概念。您应该分配一个Vec<*const c_char>并将其返回,将C侧的函数定义为extern char** string_from_rust()

或者,因为要返回两个指针,所以使用带有两个成员而不是数组的#[repr(C)]结构。