将数组从 C++ 返回到 Rust FFI 中的 Rust

八度

我有一个用 C++ 编写的函数,它将从 Rust 中调用。这个函数构造一个数组并且必须将它返回给 Rust:

主文件

extern crate libc;

use libc::c_void;

extern {
    fn construct_array(arr_ptr: *mut u32, arr_size: u32) -> c_void;
}

fn main() {
    let arr_size: usize = 4;
    let mut arr: Vec<u32> = Vec::with_capacity(arr_size);

    unsafe {
        construct_array(arr.as_mut_ptr(), arr_size as u32);
        let result = std::slice::from_raw_parts(arr.as_mut_ptr(), arr_size);
        println!("Result from rust {:?}", result);
    }
}

函数文件

extern "C" void construct_array(uint32_t* arr_ptr, uint32_t arr_size) {
    uint32_t arr[arr_size];

    for (uint32_t i = 0; i < arr_size; i++) {
        arr[i] = i;
    }

    // Print array items
    printf("Result from c++ [");
    printf("%u", arr[0]);
    for (uint32_t i = 1; i < arr_size; i++) {
        printf(", %u", arr[i]);
    }
    printf("]\n");

    arr_ptr = &arr[0];
}

但是,当我运行它时,会打印以下内容:

$ cargo run
Result from c++ [0, 1, 2, 3]
Result from rust [0, 0, 0, 0]

如何在 C++ 中正确构造数组并通过 FFI 将其传递给 Rust?

麦卡顿

您的问题可以单独在 C++ 中演示:

int main() {
    uint32_t foo[12];
    construct_array(foo, 12);

    printf("Actual result from C++:");
    for (auto i = 0; i < 12; ++i) printf("%u\n", foo[i]);
}

这会打印垃圾,并且来自您“复制”数组的方式:

arr_ptr = &arr[0];

这会将数组的地址分配给局部变量,arr_ptr并且不做任何处理。即使这有效,您也会让本地数组的地址转义,那就是 UB。相反,您可以跳过arr缓冲区并直接使用传递给您的函数的数组:

extern "C" void construct_array(uint32_t* arr_ptr, uint32_t arr_size) {
    for (uint32_t i = 0; i < arr_size; i++) {
        arr_ptr[i] = i;
    }

    // Print array items
    printf("Result from c++ [");
    printf("%u", arr_ptr[0]);
    for (uint32_t i = 1; i < arr_size; i++) {
        printf(", %u", i);
    }
    printf("]\n");
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP FFI-将数组Rust函数返回到PHP

来自分类Dev

从Rust FFI访问DPDK中的静态C函数

来自分类Dev

如何将引用/指针传递给Rust结构到C ffi接口?

来自分类Dev

在Rust FFI中混合使用静态库和动态库

来自分类Dev

如何通过C-FFI从Rust调用Nim函数?

来自分类Dev

如何将Rust`Vec <T>`暴露给FFI?

来自分类Dev

将C数组传递给Rust函数

来自分类Dev

带Windows CryptoUnprotectData的Rust FFI

来自分类Dev

在Rust中返回可变引用

来自分类Dev

从 Rust 中的函数返回未知大小的多维数组

来自分类Dev

Rust中的耦合数组

来自分类Dev

在Rust中解释C声明

来自分类Dev

将Rust任务嵌入到C程序中?

来自分类Dev

是否可以将C枚举包装在Rust中?

来自分类Dev

const指针的Rust FFI签名转换

来自分类Dev

const指针的Rust FFI签名转换

来自分类Dev

从Rust函数返回字符串以使用FFI进行调用

来自分类Dev

如何使用ruby ffi gem在rust库中调用独立函数?

来自分类Dev

如何使用ruby ffi gem在rust库中调用独立函数?

来自分类Dev

如何在Rust的FFI中使用C预处理器宏?

来自分类Dev

如何在Rust的FFI中使用C预处理器宏?

来自分类Dev

Rust FFI将特征对象作为上下文传递来调用回调

来自分类Dev

如何使用FFI将2D矢量从Rust传递到Fortran?

来自分类Dev

将C ++ / CLI中的int数组返回到c#.NET

来自分类Dev

返回包含Rust中引用的对象

来自分类Dev

如何在Rust Closure中返回引用

来自分类Dev

从Rust中的函数返回异步函数

来自分类Dev

在Rust中返回提供的参数是惯用的吗?

来自分类Dev

返回包含Rust中引用的对象