将结构映射到基础缓冲区

问题描述

我尝试按以下方式将简单的结构映射到基础缓冲区,其中修改结构还会修改缓冲区:

#[repr(C,packed)]
pub struct User {
    id: u8,username: [u8; 20],}

fn main() {
    let buf = [97u8; 21];
    let mut u: User = unsafe { std::ptr::read(buf.as_ptr() as *const _) };

    let buf_addr = &buf[0] as *const u8;
    let id_addr = &u.id as *const u8;
    println!("buf addr: {:p} id addr: {:p} id val: {}",buf_addr,id_addr,u.id);
    assert_eq!(buf_addr,id_addr); // TODO addresses not equal

    u.id = 10;
    println!("id val: {}",u.id);
    println!("{:?}",&buf);
    assert_eq!(buf[0],u.id); // TODO buffer not updated
}

但是,缓冲区的起始地址与结构中第一个成员的地址不同,并且修改结构不会修改缓冲区。上面的示例有什么问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)