在以下代码中
fn main() {
let a = get_int();
address_of(&a);
}
fn get_int() -> i32 {
let a = 1;
println!("{:p}", &a);
a
}
fn address_of<A>(a: &A){
println!("{:p}", a);
}
输出
0x7fff51d1ba94
0x7fff51d1bb1c
为什么打印相同值时内存地址会有所不同?这是否意味着范围中的变量超出范围时将被复制到不同的内存位置?
答案 0 :(得分:1)
是的,Rust按值传递变量。因此,如果您返回一个变量,它将获得一个不同的内存地址。
答案 1 :(得分:0)
要添加到@MSathieu's answer,按值返回的Rust值移动到另一个位置。如果您在堆中分配了内存并打印了引用的值,它们将保持不变:
fn main() {
let a = get_int();
address_of(&(*a));
}
fn get_int() -> Box<i32> {
let a = Box::new(10);
println!("{:p}", a);
a
}
fn address_of<A>(a: &A){
println!("{:p}", a);
}
打印:
0x7fc9a6c1f008
0x7fc9a6c1f008
Box
本身在这里按值移动,但其中的引用保持不变: - )