字符串文字是不可变的吗

Are string literals immutable

我正在按照 Rust 书学习 Rust,目前正在学习所有权。这里提到,

We’ve already seen string literals, where a string value is hardcoded into our program. String literals are convenient, but they aren’t suitable for every situation in which we may want to use text. One reason is that they’re immutable.

下面的代码运行没有任何问题,这里我改变了a的值,如果不可变性可以改变那里说明的问题是什么?

fn main() {
   let mut a = "Hello";
   println!("{}", a);
   a = " World";
   println!("{}",a);
 }

rust 编译器生成的可执行二进制文件在 read-only 数据部分 rodata.

中包含字符串文字“Hello”和“World”
$ cargo build --release
$ readelf -x .rodata target/release/demo | grep Hello
  0x0003c000 48656c6c 6f000000 0a576f72 6c640000 Hello....World..

因为这些字面量被放置在一个不可变的部分,操作系统禁止修改它们。

fn main() {
    let mut a = "Hello";
    println!("{}", a);

    unsafe { (a.as_ptr() as *mut u8).write(42) };
    println!("{}", a);
}
$ cargo run
Hello
Segmentation fault

然而,变量 a 的类型是 &str,因此是一个指向字符串切片的指针,它存在于堆栈中。所以,a先指向“Hello”的地址,再指向“World”的地址是完全有效的。