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,那么栈帧的内存分配大概是这样:
| 栈地址 | 内容 | 值 |
|---|---|---|
| 0x7ff0 | name.ptr(指针) | 0x1fcd(堆地址) |
| 0x7ff8 | name.len(长度) | 4 |
| 0x8000 | name.capacity(容量) | 4 |
| 0x8008 | name_ref(引用) | 0x7ff0(name的栈地址) |
为什么是栈地址而非堆地址?
引用的本质是指向被引用变量本身的指针。这里name_ref = &name表示借用的是name这个变量(栈上的String结构体),而非直接指向堆里的字符串数据。当你使用*name_ref时,是解引用得到name这个结构体,再通过结构体的指针字段访问堆中的字符串内容。
如果name_ref存储的是堆地址,那它就和name.ptr完全一样,也就失去了引用作为"变量借用"的意义——Rust需要通过引用追踪被借用的变量(name)的生命周期,确保借用规则被遵守,这依赖于引用指向的是原变量的位置。
内容的提问来源于stack exchange,提问作者Panther Coder
相关产品推荐
相关产品推荐

