I’m not familiar either, but I think Rust has a “Box” (it’s literally called box) mechanism which you can use to collect C data such as complex structs and then manipulate them within an unsafe block.
I think it can also share pointer addresses with C code, but I’m not sure how that works either.
Their docs have this example, calling C function from Rust side:
extern "C" {
fn abs(input: i32) -> i32;
}
fn main() {
unsafe {
println!("Absolute value of -3 according to C: {}", abs(-3));
}
}