局部变量持有相同的内存地址

Local variables hold the same memory addresses

以下程序打印两个不同变量的地址。

#include <iostream>
using namespace std;

void f1()
{
    int i,k;
    cout<<"f1 : "<<&i<<endl;
}

void f2()
{
    int j;
    cout<<"f2 : "<<&j<<endl;
}

int main() {
    f1();
    f2();
    return 0;
}

Live demo

当我在 GCC 上 运行 这个程序时,我想知道,两个变量有相同的地址。

为什么两个变量的地址相同?

编辑:

void f1()
{
    int i = 10;
    cout<<"f1 : "<<&i<<endl;
    cout<<"value of  : "<<i<<endl;
}

void f2()
{
    int j;
    cout<<"f2 : "<<&j<<endl;
    cout<<"value of j : "<<j<<endl;
}

int main() {
    f1();
    f2();
    return 0;
}

Live Demo 2

在此示例中,如果我将值 10 分配给 i,则 j 也会打印 10。我认为它无效,因为 j 未初始化。

因为它们的生命周期不重叠,所以编译器能够重用它们的存储空间。

他们正在使用相同的堆栈内存块。在 f1 调用返回后,堆栈内存是空闲的。然后 f2 再次获得相同的堆栈内存。因此,如果您在另一个函数 f3 中调用 f2,那么您可能会看到不同的地址。

每次函数调用都需要有自己的位置来存储变量。但是一旦函数returns,变量就不再存在了。没有理由不能重复使用该地址。它不一定是,但没有理由不能。

堆栈space用于保存调用函数时return函数及其局部变量所需的信息。当函数 returns 时,局部变量从堆栈中移除,return 信息从堆栈中移除,使堆栈回到调用函数时的位置。由于这两个函数调用是相似的,因此在两种情况下它们最终都使用相同的堆栈,从而使局部变量具有相同的地址。

In that example, if I assigned value 10 to i then j also print 10. I think it is not valid.

关于你的第二个例子(请post问题中与问题相关的代码,不要link'em):

void f2()
{
    int j;
    cout<<"f2 : "<<&j<<endl;
    cout<<"value of j : "<<j<<endl;
}

这是 未定义的行为j 具有不确定的值,任何 (*) 评估都会导致不确定的值(发生在 cout<<j调用 ) 给出未定义的行为。

实际上,这包括具有任意值、陷阱表示(在拥有它们的平台上,诚然据我所知现在并不多 :) )并且最糟糕的是允许编译器进行优化,就好像 j 确实具有任何值(结果可能违反逻辑的行为)。

(*) 有例外,但与本例无关

In that example, if I assigned value 10 to i then j also print 10. I think it is not valid.

在此示例中,您没有使用任何 c++ 的内存分配概念。因此,您刚刚存储在 i 中的值将保持不变,因为它从未从为 i 分配的内存中删除,然后当您调用 fun2 时,相同的内存被分配给 j .这就是为什么您对两个变量和相同地址获得相同值的原因。

你应该知道局部变量和全局变量在不同函数中的工作,变量是局部的。

每次调用该函数时,它都会为其分配值和内存地址,因为它存储在堆栈内存中并在函数结束时被清理。释放内存,可以再次使用相同的内存。

但可能是您的编译器生气了。 把完整的源码放上去仔细琢磨