Rust中如何在结构体字段中获取同结构体元素的地址?
解决CirBuffer初始化时获取buf[0]地址的问题
在create方法里,你无法直接用self访问还未初始化完成的结构体成员。以下是几种正确的实现方式:
方式一:先声明buf变量(可读性最优)
struct CirBuffer { buf: [u8; 256], lowest_mem_addr: *const u8, highest_mem_addr: *const u8, is_empty: bool, is_full: bool, } impl CirBuffer { fn create() -> Self { let buf = [0; 256]; CirBuffer { buf, lowest_mem_addr: &buf[0] as *const u8, highest_mem_addr: &buf[255] as *const u8, is_empty: true, is_full: false, } } }
方式二:直接使用数组的as_ptr方法(更简洁)
利用Rust固定大小数组提供的as_ptr()方法,直接获取数组起始指针,效果和&buf[0] as *const u8完全一致:
impl CirBuffer { fn create() -> Self { let buf = [0; 256]; CirBuffer { buf, lowest_mem_addr: buf.as_ptr(), highest_mem_addr: buf.as_ptr().add(255), // 通过指针偏移获取最后一个元素地址 is_empty: true, is_full: false, } } }
方式三:结构体初始化时直接取地址(不推荐,可读性差)
如果不想单独声明buf变量,也可以直接在结构体初始化表达式中取地址,但这种写法不够直观:
impl CirBuffer { fn create() -> Self { CirBuffer { buf: [0; 256], lowest_mem_addr: &[0; 256][0] as *const u8, highest_mem_addr: &[0; 256][255] as *const u8, is_empty: true, is_full: false, } } }
内容的提问来源于stack exchange,提问作者RRON
相关产品推荐
相关产品推荐

