我对以下问题感到困惑。如果我理解正确
let x = &42;
内部扩展到
let x_value = 42;
let x = &x;
我想我已经在Rust书中看到了这个,但我找不到它的引用。
我的问题是关于以下代码:
let x = 42;
let rx = &x;
let px = rx as *const i32 as *mut i32;
unsafe {
*px = 0;
}
println!("{}", x);
正如预期的那样,这会打印0
。但是,如果我写
let rx = &42;
let px = rx as *const i32 as *mut i32;
unsafe {
println!("Deref");
*px = 0;
}
println!("{}", x);
程序在打印出Deref
后终止。当px
被取消引用时,显然会出现问题。我想我对let x = &42
内部扩展的第一次评估是错误的。
答案 0 :(得分:6)
您正在调用未定义的行为。来自Rust Reference:
12.3行为被视为未定义
以下是所有Rust代码中禁止的行为列表,包括不安全的块和不安全的函数。 [...]
- 变异非可变数据(即通过共享引用或
$ git checkout develop $ git pull origin master
绑定所拥有的数据到达的数据),除非该数据包含在let
中。
由于您正在改变非可变数据,因此您正在调用未定义的行为。它在第一个版本中完全有效的事实只是(坏)运气。