但我确实有不错的 C 背景
Rust 代码的道德等价物是:
int *v = NULL;
imeGet(addr, v);
*v
这会出现错误,因为 C 代码可能会取消引用该内容v
来存储值,除非你传入了 NULL,所以它更有可能会繁荣。
您需要为该值创建存储,然后向函数提供对该存储的引用:
fn ime_get(addr: u8) -> i32 {
let mut v = 0;
unsafe { imeGet(addr, &mut v) };
v
}
任何指针类型的解决方案都使用ptr::null_mut:
unsafe {
let mut v = std::ptr::null_mut();
takes_a_pointer_pointer(addr, &mut v);
v
}
适用于任何类型用途的通用解决方案mem::MaybeUninit:
unsafe {
let mut v = std::mem::MaybeUninit::uninit();
takes_a_value_pointer(addr, v.as_mut_ptr());
v.assume_init()
}
为了完整性,您应该检查返回值:
fn ime_get(addr: u8) -> Option<i32> {
let mut v = 0;
let success = unsafe { imeGet(addr, &mut v) };
if success {
Some(v)
} else {
None
}
}
Rust 和 C 在传递指针方面的工作方式之间的差异。
就这个级别来说,确实没有。