- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是,当局部变量的生命周期处于 block 级别时,为什么即使在 block 之外指针仍然打印局部变量的值
#include<iostream>
using namespace std;
int main(){
int *p;
{
int n;
n=5;
p=&n;
}
cout<<*p;
return 0;
}
最佳答案
范围是指标识符的可用性。
生命周期是指在程序执行期间对象处于事件状态并且可以合法访问的实际持续时间。它们是不同的东西。
您的代码有 undefined behaviour因为对象 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()
。但即使在 func()
外部也可以通过指针访问 var
。这是完全正确的。
将其与您的程序进行比较。 n
具有自动存储期限,其生命周期和范围都限制在括号 { }
内。所以使用指针访问n
是无效的。
但是,如果将其 (n
) 存储类更改为 static
,那么您就可以执行您所做的操作,因为即使在括号之外,对象仍然处于事件状态。
关于c++ - c/c++ 中局部变量的作用域和生命周期的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31289118/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!