通过 Rust FFI 更改 C 数组元素

KDN*_*KDN 0 ffi rust

我正在使用 Rust 来测试一些 C 代码:

哈哈

#include "lol.h"
int a[10]; //Assume lol.h has an extern declaration for a[10]
Run Code Online (Sandbox Code Playgroud)

库文件

extern "C" {
    static a: *mut i32;
}

fn set_a(val: i32, index: usize) {
    assert!(index < 10);
    unsafe {
        a[index] = val;
    }
}

fn get_a(index: usize) {
    assert!(index < 10);
    unsafe { a[index] }
}
Run Code Online (Sandbox Code Playgroud)

我使用cc crate来编译和链接 lol.o。set_aget_a函数怎么写?编译器说:

extern "C" {
    static a: *mut i32;
}

fn set_a(val: i32, index: usize) {
    assert!(index < 10);
    unsafe {
        a[index] = val;
    }
}

fn get_a(index: usize) {
    assert!(index < 10);
    unsafe { a[index] }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*fan 5

您可以使用该offset方法查找单个元素,或者使用std::slice::from_raw_parts_mut指针和(可能是动态的)长度创建切片,或者static mut a: *mut [i32; 10]首先使用(*a)[index](使用它)。

但是:我很确定int a[10];fromC不会导出指向该数组的指针的位置,它会导出数组的位置(即第一个元素的位置),并且extern在 Rust 中期望一个位置为给定类型(即它在两侧实现为指针),所以我会试试这个:

extern "C" {
    static mut a: [i32; 10];
}

fn set_a(val: i32, index: usize) {
    unsafe {
        a[index] = val;
    }
}

fn get_a(index: usize) -> i32 {
    unsafe { a[index] }
}
Run Code Online (Sandbox Code Playgroud)