C++局部变量
C++ Local Variable
我的一个学生问了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::i
和fun2::i
确实是两个不同的变量,具有不同的范围和存储持续时间。编译器选择将它们放在同一个虚拟内存地址上这一事实不会改变任何事情。
但是这两个函数都给了我相同的内存位置。
它之所以能够这样做,是因为在fun2()
返回后,它使用的堆栈空间(intfun2::i
)是可用的,fun::i
可以重用该空间。
总而言之,请看SO的这个答案:
What is Scope?
作用域是变量可以位于的代码区域或部分 访问。
What is a lifetime?
生存期是对象/变量处于有效状态的持续时间 州。
对于,自动/局部非静态变量生存期仅限于其 范围。换句话说,自动变量会自动销毁 一旦创建它们的作用域(
{
,}
)结束。因此得名 自动开始。
fun2
中的内存地址可在fun2
结束后重复使用。
该内存位置恰好在fun
中重复使用。
(不能保证它是相同的地址或不同的地址;两者都是可能的)
您是否认为可以保证内存地址永远不会在任何地方重复使用? 这样你的电脑不会用完内存吗?
如果要查看使用的单独地址,请拨打fun2
fun
:
void fun2()
{
int i;
cout<<"This is the address in fun2:" << &i <<endl;
fun(); // This will show a different address.
}
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 返回对局部变量 - C++ 的引用
- 是否可以影响 C++ 中回调函数的局部变量?
- 警告 C4101 未引用的局部变量
- 线程局部变量的初始化顺序