变量的生存期和作用域

采石工 2010-12-18 03:24:36
下面pa指向的是a,而a的作用域只限于离它最近的大括号内,而*pa能实现对a的访问,是不是说a的生存期不在大括号内,而是在整个main函数的存在时间?

#include <stdio.h>

void main()
{
int *pa;
{
int a=10;
pa=&a;
}
int a=9;
//error C2065: 'a' : undeclared identifier
// printf("%d\n",a);
printf("%d\n",*pa);//为什么不报错?
}
...全文
86 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pingdan32 2010-12-18
  • 打赏
  • 举报
回复
a定义在内部他被调用之后就释放,也就是说此时a不再是之前访问的a地址了,但是此块内存的数据没有释放,他的地址之前被赋给pa,调用*pa是就会把里面的数据取出来。实际上内存的数据一直存在知道再次被新的数据覆盖!!!也就是说内存中一直是有数据的,即使我们没有用它,它也会存储一个数据,不过此时是一个随机的数据!!!!
xgrsb2005 2010-12-18
  • 打赏
  • 举报
回复
int *pa;
{
int a=10;
pa=&a;
}//到这里,变量a的就从内存中释放了,生存周期结束
但是
int *pa;
得作用域是整个main(){},所以printf("%d\n",*pa);没有报错,存变量a的内存被释放了,但是指针变量所指的内存中的值没有被释放。
关键字:生命周期,作用域
luciferisnotsatan 2010-12-18
  • 打赏
  • 举报
回复
printf("%d\n",*pa);//为什么不报错?
这里的pa是野指针,但你这么写是不会报错的,你只是读取栈上的数据。但值是什么,未定义
就想叫yoko 2010-12-18
  • 打赏
  • 举报
回复
printf("%d\n",*pa);
不报错很正常,只要pa的生存周期还在,指向哪不重要,你是读而不是写
另外这个*pa肯定是不等于9的,前后两个a不是同一个a
jijingdefeng 2010-12-18
  • 打赏
  • 举报
回复
新手来学习下
matrixcl 2010-12-18
  • 打赏
  • 举报
回复
在大括号外访问*pa属于越界操作。越界读一下是不一定报错的(其实写一下也不一定报错)。但是不报错不等于没错,读操作可能读到非期望的值,写操作就严重了,可能改变不想关代码的值。

这是典型的野指针用法,不注意的出了问题会抓狂的
bdmh 2010-12-18
  • 打赏
  • 举报
回复
不是,首先
int a=10,和 int a=9这是两个东西,当你{}执行完毕,内部的a已经释放,但是,他之前写入的内存并没有被改写,所以你访问*pa时,pa地址的值并没有被清空
qf17331733 2010-12-18
  • 打赏
  • 举报
回复

void main()
{
int *pa;
{
int a=10;
pa=&a; //注意了~pa是属于括号外的~,这里的a会释放,但pa不会
}
int a=9;
//error C2065: 'a' : undeclared identifier
// printf("%d\n",a);
printf("%d\n",*pa);//为什么不报错?
}


69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧