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

Rust字符串字面量及动态&str的存储位置疑问:栈还是堆?

字符串字面量与&str引用的存储位置解析

一、字符串字面量的存储位置

先看你给出的第一段代码:

fn main () {
    let mut s: &str = "hello";
    s = "hey";
    println! ("{}", s);
}

字符串字面量(比如"hello"、"hey")既不在栈上,也不在堆上——它们会被编译进程序的只读数据段(例如Linux系统里的.rodata段)。这是因为字面量是编译期就确定的硬编码值,且不可修改,放在只读区能避免意外篡改,还能节省运行时内存开销。

栈上存储的是&str类型的变量s,它本质是一个"胖指针":包含指向字面量首字符的指针,以及字符串的长度。你修改s的时候,只是把这个胖指针换成了指向另一个字面量("hey")的新指针和长度,完全不涉及字面量本身的修改。

二、运行时输入场景下&str指向的内容存储

再看第二段运行时获取用户输入的代码(补充了必要的导入和错误处理):

use std::io;

fn main () {
    let mut user_input = String::new();
    let stdin = io::stdin();
    stdin.read_line(&mut user_input).expect("读取输入失败");
    
    let ab = user_input.as_str();

    println!("input {}, {} ", user_input, ab);
}

这里的ab是&str类型,它指向的内容是user_input(String类型)的底层数据——而String的动态内容是存储在堆上的。

as_str()方法并没有复制字符串内容,只是创建了一个指向String堆内存的引用。栈上的ab依然是那个包含指针和长度的胖指针,它指向的字符串本体(用户输入的内容)在堆上,因为用户输入的长度是运行时确定的,栈无法存储编译期大小未知的数据,所以String会在堆上动态分配内存来存放内容。


内容的提问来源于stack exchange,提问作者Thinker-101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:14