局部变量保存相同的内存地址

Local variables hold the same memory addresses

本文关键字:内存 地址 保存 局部变量      更新时间:2023-10-16

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

#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;
}

现场演示

当我在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;
}

现场演示 2

在此示例中,如果我将值 10 分配给ij也打印10 。我认为这是无效的,因为j未初始化。

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

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

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

在该示例中,如果我将值 10 分配给 i,则 j 也会打印 10。我 认为这是无效的。

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

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

在该示例中,如果我将值 10 分配给 i,则 j 也会打印 10。我认为这是无效的。

关于您的第二个示例(请在问题中发布与问题相关的代码,不要链接它们):

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

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

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

(*) 有例外,但在这种情况下无关紧要

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

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

但可能是你的编译器生气了。放完整的源代码,然后仔细弄清楚。