局部变量-重新创建

Local variables - recreated

本文关键字:创建 -重 新创建 局部变量      更新时间:2023-10-16

我想知道为什么局部变量不得到重新创建,如果函数被召回?

#include <iostream>
using namespace std;  
void func(void)
{
    int a = 0;
    cout << &a << endl;
}

int main(void)
{
    func();
    func();
    func();
    func();
    system("pause");
    return 0;
}

为什么变量a每次都映射到相同的内存地址?

标准中没有定义局部变量的地址。从一次调用到下一次调用可能是相同的,也可能是不同的。

在这个特殊的情况下,在你的机器和编译器上使用这段代码,地址很可能是相同的,因为每次调用func时,它都是从main调用的,所以每次堆栈的布局都是相同的。如果要从main调用其他函数,然后调用func,那么地址很可能是不同的。

然而,

这个行为是不能依赖的。

变量每次都被重新创建,但是相同的地址被重用,因为& help;为什么不呢?每次,它都是一个可用的内存位置,没有其他内容。为什么不用它呢?如果每次都需要不同的位置,那么最终会无缘无故地"耗尽"内存。对于您的系统来说,在相同的函数中为相同的变量重用相同的位置是很方便的。但是,如果您的程序更复杂,您可能会看到更不可预测的行为。

您已经演示了当堆栈处于相同状态时调用函数时,堆栈变量可能位于相同的地址。

为什么不尝试调用函数时,堆栈是在一个不同的状态?例如,让它成为递归的:

#include <iostream>
using namespace std;  
void func(int n)
{
    int a = 0;
    cout << "n=" << n << ": " << &a << endl;
    if (0 < n)
        func(n-1);
}
int main()
{
    func(5);
    return 0;
}

示例输出:

n=5: 0x7fff519aa848
n=4: 0x7fff519aa808
n=3: 0x7fff519aa7c8
n=2: 0x7fff519aa788
n=1: 0x7fff519aa748
n=0: 0x7fff519aa708

可以看到,每次调用func()时,堆栈处于不同的状态,因此a的地址每次都可以不同。