【发布时间】:2018-07-14 10:27:00
【问题描述】:
我有一个用 C++ 编写的函数,该函数将从 Rust 调用。这个函数构造了一个数组并且必须把它返回给 Rust:
main.rs
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);
}
}
funcs.cpp
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?
【问题讨论】:
-
construct_array正在返回一个指向本地自动变量的指针,该指针将在函数完成后立即消失。这将是 C 或 C++ 中的未定义行为。在 Rust 中,它不会轻易编译...