c/c++中局部变量作用域和生命周期的混淆
Confusion in Scope and Life Time of a local variable in c/c++
我的问题是,当局部变量的生命周期在块级别时,为什么指针仍然打印局部变量的值,甚至在块之外
#include<iostream>
using namespace std;
int main(){
int *p;
{
int n;
n=5;
p=&n;
}
cout<<*p;
return 0;
}
Scope表示标识符的可用性。
生存时间指的是在程序执行期间,对象处于活动状态并可合法访问的实际持续时间。它们是不同的东西。
你的代码有未定义的行为,因为对象n
的生命周期在关闭}
时结束,因为你通过指针访问它。
一个简单的例子可能会更清楚:
#include<stdio.h>
int *func()
{
static int var = 42;
return &r;
}
int main(void)
{
int *p = func();
*p = 75; // This is valid.
}
这里,var
具有static
的存储时间。也就是说,在程序终止之前它是活的。但是,变量var
的作用域仅限于函数func()
。但是var
甚至可以在func()
之外通过指针访问。
将此与您的程序进行比较。n
具有自动存储持续时间,它的生命周期和范围都限制在括号{ }
中。所以使用指针访问n
是无效的。
然而,如果你把它的(n
)存储类改为static
,那么你可以做你所做的,因为对象是活的,即使在括号外。
相关文章:
- 如何在共享库的整个生命周期内存储数据
- 如何理解句子的生命周期始于对e的评估
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了
- Go/C++gRPC客户端通道和存根生命周期
- 如何将"this"的生命周期移动到C++中的另一个对象中?
- 是否可以通过使用移动/交换 c++11 来延长返回的临时变量的生命周期
- 使用对象的生命周期作为设置器的安全性
- 临时人员的生命周期传递给函数
- 我想知道在构造函数中初始化变量时的生命周期
- Lua 用户数据生命周期管理
- 如何使用 epoll(void* event.data.ptr) 管理 Connection 的生命周期
- C++引用的生命周期
- 在堆栈上有一个对象,而不是在函数的整个生命周期内
- 在 Boost ASIO 服务器中处理生命周期
- C++ lambda 生命周期
- 使用互斥锁跟踪另一个应用的生命周期
- QSharedPointer 或 std::shared_ptr 的生命周期
- 来自async_resolve的 boost::asio::ip::tcp::resolver::iterator 的生命周期是多久?
- 如何调整属于类的唯一指针的字符数组的大小.它必须在程序的整个生命周期中保持活力
- 延长 std::tuple<int&,int> 的生命周期,方法是将其分配给 const std::tuple<int, int>&