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

Posted

技术标签:

【中文标题】如何在 Rust 中表示指向 C 数组的指针?【英文标题】:How to represent a pointer to a C array in Rust? 【发布时间】:2017-01-05 15:17:26 【问题描述】:

我需要 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]))

【问题讨论】:

它是一个指针,所以你可以在extern函数签名中使用*mut std::os::raw::c_void并将其转换为正确的类型。 @PavelStrakhov:这是一个答案:) @PavelStrakhov 使用正确的类型比使用void* 提供一些类型安全性,所以我只会将它用作最后的手段。你的意思是 rust 没有解决方案吗? 【参考方案1】:

对于固定大小的数组,您需要使用 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 并将其转换为正确的类型。

【讨论】:

以上是关于如何在 Rust 中表示指向 C 数组的指针?的主要内容,如果未能解决你的问题,请参考以下文章

在 protobuf-c 中表示指针变量

如何在 TypeScript 中表示包含多种类型的二维数组?

c语言如何输出指针所指向的值

如何将 C 变长数组代码转换为 Rust?

如何在c中为指向char的指针数组分配内存

c语言如何输出指针所指向的ŀ