C++局部变量

C++ Local Variable

本文关键字:局部变量 C++      更新时间:2023-10-16

我的一个学生问了C++中局部变量的生存期。我告诉他,它仅限于使用它的功能的主体,但在我看到以下内容后,我感到惊讶。

它声明两个函数fun()fun2(),并在两个函数中声明int i。根据我的概念,fun()fun2()int i都将作为不同的变量保存在内存中,但这两个函数都给了我相同的内存地址。需要帮助。

void fun()
{
int i;
std::cout << &i << std::endl;
}
void fun2()
{
int i;
std::cout << &i << std::endl;
}
void main()
{
fun2();
fun();
}

我的一个学生问了一个问题,即 C++ 中局部变量的生命是什么。 我告诉他,它仅限于使用它的函数的主体

这是不准确的。自动变量的生存期一直延伸到声明该变量的作用域的末尾。例如,复合语句(也称为块)中的变量一直延伸到该复合语句的末尾,无论该复合语句是函数的主体,还是嵌套在函数主体中。

例:

void foo() {
{
int i;
}
// lifetime of i has ended, but function hasn't returned yet
}

每个作用域对它们的扩展范围都有不同的规则。例如,函数参数的范围一直延伸到函数的末尾。在控制结构的子语句(如循环或条件语句)中声明的名称范围一直延伸到控制结构的末尾。

静态局部变量具有静态存储持续时间,其生存期不受其声明范围的约束。

根据我的概念,fun() 和 fun2() 的 int i 都将保存为内存中的不同变量,但这两个函数都为我提供了相同的内存位置

它们被"保存为不同的变量",但这与变量是否存储在单独的内存位置无关。

事实上,根据您的概念,fun的局部变量的生存期已经结束,因此没有理由为什么fun2的局部变量不能使用与 - 现已销毁的 - 对象曾经相同的内存。

根据我的概念,fun()fun2()的 inti都将作为不同的变量保存在内存中。

fun::ifun2::i确实是两个不同的变量,具有不同的范围和存储持续时间。编译器选择将它们放在同一个虚拟内存地址上这一事实不会改变任何事情。

但是这两个函数都给了我相同的内存位置。

它之所以能够这样做,是因为在fun2()返回后,它使用的堆栈空间(intfun2::i)是可用的,fun::i可以重用该空间。

总而言之,请看SO的这个答案:

What is Scope?

作用域是变量可以位于的代码区域或部分 访问。

What is a lifetime?

生存期是对象/变量处于有效状态的持续时间 州。

对于,自动/局部非静态变量生存期仅限于其 范围。换句话说,自动变量会自动销毁 一旦创建它们的作用域({})结束。因此得名 自动开始。

fun2中的内存地址可在fun2结束后重复使用。

该内存位置恰好在fun中重复使用。
(不能保证它是相同的地址或不同的地址;两者都是可能的)

您是否认为可以保证内存地址永远不会在任何地方重复使用? 这样你的电脑不会用完内存吗?

如果要查看使用的单独地址,请拨打fun2fun

void fun2()
{
int i;
cout<<"This is the address in fun2:" << &i <<endl;
fun(); // This will show a different address.
}