能否从Rust传递数组到C语言?

3

我有一个非常基本的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没有“返回数组”的概念。您应该分配一个Vec<*const c_char>并将其返回,将C端的函数定义为extern char** string_from_rust()
或者,由于您正在返回两个指针,请改用具有两个成员的#[repr(C)]结构,而不是数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接