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

Rust引用在栈内存中的存储形式及实例问题咨询

Rust引用在栈帧中的内存存储解析

先看你给出的代码:

fn main() {
    let name = String::from("Somu");
    let name_ref = &name;
}

首先纠正一个常见误解:String类型的变量name在栈中不是只存储堆内存地址。Rust的String本质是封装了Vec<u8>的结构体,它在栈上的存储是一个三元组:

  • 指针:指向堆中存储字符串字节的起始地址(比如你示例里的0x1fcd)
  • 长度:字符串的字节数("Somu"是4字节)
  • 容量:当前堆分配的内存空间大小(这里至少为4)

接下来回答核心问题:name_ref在栈帧中存储的是**name这个栈上结构体的起始地址**,而非堆内存地址。

具体内存布局示例(假设栈地址为示例值)

假设name在栈中的起始地址是0x7ff0,那么栈帧的内存分配大概是这样:

栈地址内容值
0x7ff0name.ptr(指针)0x1fcd(堆地址)
0x7ff8name.len(长度)4
0x8000name.capacity(容量)4
0x8008name_ref(引用)0x7ff0(name的栈地址)

为什么是栈地址而非堆地址?

引用的本质是指向被引用变量本身的指针。这里name_ref = &name表示借用的是name这个变量(栈上的String结构体),而非直接指向堆里的字符串数据。当你使用*name_ref时,是解引用得到name这个结构体,再通过结构体的指针字段访问堆中的字符串内容。

如果name_ref存储的是堆地址,那它就和name.ptr完全一样,也就失去了引用作为"变量借用"的意义——Rust需要通过引用追踪被借用的变量(name)的生命周期,确保借用规则被遵守,这依赖于引用指向的是原变量的位置。

内容的提问来源于stack exchange,提问作者Panther Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:38:31