I'm writing a safe Rust layer with which I can call functions from a C library in Rust. I've generated the unsafe bindings using rust-bindgen, but I'm getting a little confused on the differences between how Rust and C work with regards to passing pointers.
The C function looks like this:
bool imeGet(unsigned char address, int *value);
It reads an I2C sensor at address
, stores the result in value
, and returns TRUE
on success.
Bindgen has the Rust function looking like this:
pub fn imeGet(address: ::std::os::raw::c_uchar,
value: *mut ::std::os::raw::c_int) -> bool;
And my safe caller looks like this currently:
pub fn ime_get(addr: u8) -> i32 {
let v: &mut i32 = 0;
unsafe {
imeGet(addr, v);
*v
}
}
This code doesn't compile because of the = 0
. When I didn't have that, the compiler complained about v
possibly not having been initialized. My intent is to handle the success within this function, and just return the i32
value.
How do I handle the behavior of the *mut c_int
argument? I tried to declare v
as a reference and return its dereferenced value (above), but that doesn't work. I also tried to just return v
, but I don't really want the return value to stay mutable.
I'm pretty new to Rust, but I do have a decent background in C, which may be my source of confusion.