- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读 Rust 书籍以学习 Rust,目前正在学习所有权。它提到:
We’ve already seen string literals, where a string value is hardcodedinto our program. String literals are convenient, but they aren’tsuitable for every situation in which we may want to use text. Onereason is that they’re immutable.
下面的代码运行没有任何问题。这里我改变了a
的值,如果不可变字符串可以改变,那么问题在哪里呢?
fn main() {
let mut a = "Hello";
println!("{}", a);
a = " World";
println!("{}", a);
}
最佳答案
由 Rust 编译器生成的可执行二进制文件在只读数据部分 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: &'static str = "Hello";
println!("{}", a);
unsafe { (a.as_ptr() as *mut u8).write(42) };
println!("{}", a);
}
$ cargo run
Hello
Segmentation fault
但是,变量 a
的类型是&str
,因此是一个指向字符串切片的指针,它存在于堆栈中。因此,a
先指向“Hello”的地址,再指向“World”的地址是完全有效的。
编辑:关于不安全
block 的信息
我们想在a
指向的地址写入一些东西,以表明它确实存储在一个只读段中。
a
声明为 mut a: &str
,这意味着变量是可变的,但数据(字符串文字)是不可变的(与 mut a 相反: &mut str
😉️).因此,编译器阻止我们使用 a.as_mut_ptr()
获取指向底层字节的可变(又名可写)指针。
相反,我们必须做一个小技巧:使用 a.as_ptr()
并将返回的 const *u8
转换为 mut *u8
。最后,写入指针需要一个 unsafe
block ,因为您可能会违反 Rust 的内存安全,这可能会导致不好的事情发生,如上面所示的 Segmentation Fault。
关于rust - 字符串文字是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71902146/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!