Ответ 1
Как описано в руководство FFI, вы можете добавить атрибуты к структурам, чтобы использовать тот же макет, что и C:
#[repr(C)]
struct Object {
a: i32,
// other members
}
и у вас также есть возможность упаковать структуру:
#[repr(C, packed)]
struct Object {
a: i32,
// other members
}
И для обнаружения того, что макет памяти в порядке, вы можете инициализировать структуру и проверить, что смещения в порядке, отбрасывая указатели на целые числа:
#[repr(C, packed)]
struct Object {
a: u8,
b: u16,
c: u32, // other members
}
fn main() {
let obj = Object {
a: 0xaa,
b: 0xbbbb,
c: 0xcccccccc,
};
let a_ptr: *const u8 = &obj.a;
let b_ptr: *const u16 = &obj.b;
let c_ptr: *const u32 = &obj.c;
let base = a_ptr as usize;
println!("a: {}", a_ptr as usize - base);
println!("b: {}", b_ptr as usize - base);
println!("c: {}", c_ptr as usize - base);
}
выходы:
a: 0
b: 1
c: 3