2013-10-03 59 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 
}