2013-10-03 90 views
3

我有我正在玩的以下代碼。我有一個局部變量p,我必須打印出其地址拉姆達:本地變量的內存地址根據lambda參數的變化而變化

int main() 
{ 
    int p = 0; 
    auto lambda = [&p] { 
     std::cout << &p << std::endl; 
    }; 

    lambda(); // 0x7fff78e6b7e0 
} 

變量的地址是相同的,無論多少次,我運行的代碼。但我發現,當我改變拉姆達定義是:

auto lambda = [&p]() { 
//    ^^ 

含義,當我添加一個空的參數列表,我得到一個新的地址:

lambda(); // 0x7fff2291a260 

你可以測試一下over here。爲什麼會發生?我在Windows上使用g ++ - 4.8和clang ++運行我的代碼。

+0

我的大譁++ - 3.2.1給出了不同的* *地址時,我多次運行代碼。 – dyp

+0

爲什麼你打擾一個局部變量的地址? – Geoffroy

+0

我最近的本地clang ++ 3.4中繼191142在多次運行時也顯示不同的地址(32位)。 – dyp

回答

4

地址更改是絕對可以的。編譯器可能會爲您的lambdas生成不同的代碼。操作系統可能會加載您的程序在不同的基址。

可以確保變量的地址是無論是參數列表中指定或不一樣的:

#include <iostream> 

int main() 
{ 
    int p = 0; 
    auto lambda1 = [&p] { 
     std::cout << &p << std::endl; 
    }; 

    auto lambda2 = [&p](){ 
     std::cout << &p << std::endl; 
    }; 

    lambda1(); //0x7fffe3034fb4 
    lambda2(); //0x7fffe3034fb4 
}