局部变量-重新创建
Local variables - recreated
我想知道为什么局部变量不得到重新创建,如果函数被召回?
#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
的地址每次都可以不同。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何将stdout重定向到stderr
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何检测哪些进程更改,重命名或创建文件?
- 无法使用创建进程重定向标准输出
- 在创建共享对象时,不能使用针对未定义符号的重定位R_X86_64_PC32;使用-fPIC重新编译
- 创建进程和重定向输出
- C++ 无限循环读取文件创建重定向命令输出
- 创建一个可以在使用时重命名的文件
- 为什么创建 std::runtime_error 会重置 WSAGetLastError
- 为外壳输出重定向创建文件
- 文件重定向运算符">"不适用于创建进程() API
- 如何创建仅允许访问 C++ 中的特定用户帐户的手动重置事件
- 如何创建一个可重入的Boost协程
- 重定向计数到用winapi创建的新缓冲区