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
相关产品推荐
相关产品推荐

