如何在Rust中表示指向C数组的指针?

10

我需要在Rust中编写一个extern "C" FFI函数,并接受一个指定大小的数组。C代码传递类似以下内容:

// C code
extern int(*)[4] call_rust_funct(unsigned char (*)[3]);
....
unsigned char a[] = { 11, 255, 212 };
int(*p)[4] = call_rust_funct(&a);

如何编写适用于Rust的函数?
// Pseudo code - DOESN'T COMPILE
pub unsafe extern "C" fn call_rust_funct(_p: *mut u8[3]) -> *mut i32[4] {
    Box::into_raw(Box::new([99i32; 4]))
}

1
它是一个指针,因此您可以在外部函数签名中使用*mut std::os::raw::c_void,并将其转换为正确的类型。 - Pavel Strakhov
@PavelStrakhov:这就是一个答案 :) - Matthieu M.
@PavelStrakhov 使用正确的类型比使用 void* 更安全,因此我只会在最后的情况下使用它。你是说 Rust 没有解决方案吗? - ustulation
1个回答

8

您需要使用Rust的固定大小数组语法:

pub unsafe extern "C" fn call_rust_funct(_p: *mut [u8; 3]) -> *mut [i32; 4] {
    Box::into_raw(Box::new([99i32; 4]))
}

您也可以始终使用 *mut std::os::raw::c_void 并将其转换为正确的类型。

注:此句话涉及技术专业术语,如果不了解相关概念可能会难以理解。

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