Rust 锈迹斑斑';字符串';和';str';记忆不同?

Rust 锈迹斑斑';字符串';和';str';记忆不同?,rust,Rust,我看到了这个问题,但还是不明白,所以我知道以下内容(可能不正确): 初始化String类型的变量会在堆上分配内存,并在堆栈上存储指向该内存的指针 初始化&str类型的变量将在堆栈上存储指针,我假设指针指向堆上的str 如果是这样的话-如果String和&str都将指针存储在堆栈上指向堆上的内存位置-这是否意味着String和str(不是参考)是相同的呢?这篇文章解释得很好,并提供了一些关于两者如何工作的视觉信息: 回答你的问题,不,它们不一样。他们可以指向同一件事 String是使用strs

我看到了这个问题,但还是不明白,所以我知道以下内容(可能不正确):

  • 初始化
    String
    类型的变量会在堆上分配内存,并在堆栈上存储指向该内存的指针
  • 初始化
    &str
    类型的变量将在堆栈上存储指针,我假设指针指向堆上的
    str

如果是这样的话-如果
String
&str
都将指针存储在堆栈上指向堆上的内存位置-这是否意味着
String
str
(不是参考)是相同的呢?

这篇文章解释得很好,并提供了一些关于两者如何工作的视觉信息:

回答你的问题,不,它们不一样。他们可以指向同一件事

String
是使用
str
s存储文本的容器。它拥有所指向的数据,并可以对其进行修改或添加/删除

从文章中可以看出,
str
是:

当我们引用 由其他人“拥有”的UTF-8文本范围,或当我们 使用字符串文本创建它们


所以
str
只指向数据,也可以指向某些数据的子字符串。但是它不拥有数据,也不能修改它。

&str可以指向任何地方。对于字符串文本,它可以指向可执行文件的.data段。它可以指向堆上某个字符串所拥有的缓冲区。它可以指向mmap文件
str
实际上只是一个连续的字节区域。@IvanC谢谢你的回答,我不知道。谢谢你的回答,解释得很好。你说的
str
只指向数据,不能修改它,但我是个新手,注意到它编译得很好
let mut name:&str=“Jake Gyllenhall”;name=“汤姆·霍兰德”。您能解释一下这里发生了什么吗?这是因为变量绑定,您正在更改变量指向的对象,而不是底层数据。当您指定给name时,您正在使用新指针更改上一个指针。看到这里,我输出了地址,你可以看到它每次都在变化。简单地说:
String
,和
&str