2017-08-26 22 views
0

在下面的代碼當超出範圍時,作用域中的變量是否被複制到不同的內存位置?

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

調用堆棧上的值已被彈出,因爲函數返回。如果它繼續引用舊地址,它將訪問未初始化的內存。 – loganfsmyth

回答

1

是的,Rust通過值傳遞變量。所以如果你返回一個變量,它會得到一個不同的內存地址。

0

要添加到@MSathieu's answer,值返回的鏽值爲移動到另一個位置。如果你的內存在堆中分配的,則在打印參考的價值,他們將保持不變:

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本身是由價值搬到這裏,但是裏面的引用保持不變:-)

相關問題