这个问题在这里已有答案:
我正在使用Rust来测试一些C代码:
lol.c
#include "lol.h"
int a[10]; //Assume lol.h has an extern declaration for a[10]
lib.rs
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] }
}
我使用the cc crate来编译和链接lol.o.如何编写 set_a
和 get_a
函数?编译器说:
error[E0608]: cannot index into a value of type `*mut i32`
--> src/main.rs:8:9
|
8 | a[index] = val;
| ^^^^^^^^
error[E0608]: cannot index into a value of type `*mut i32`
--> src/main.rs:14:14
|
14 | unsafe { a[index] }
| ^^^^^^^^
2 回答
您可以使用offset方法查找单个元素,或使用std::slice::from_raw_parts_mut从指针创建切片和(可能是动态的)长度,或者首先使用
static mut a: *mut [i32; 10]
(使用(*a)[index]
来使用它) .但是:我很确定来自
C
的int a[10];
不会导出指向该数组的指针位置,它会导出数组的位置(即第一个元素的位置),并且Rust中的extern
需要一个位置给定类型的值(即它实现为两边的指针),所以我试试这个:使用:
像这样: