首页 文章

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

提问于
浏览
2

我有一个非常基本的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 回答

  • 1

    C ABI没有"returning an array"的概念 . 您应该分配 Vec<*const c_char> 并将其返回,将C侧的函数定义为 extern char** string_from_rust() .

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

相关问题