You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:52:38