请教一个函数局部变量生命周期问题

liu347182558 2016-06-01 10:12:06

#include<stdio.h>
int *test(int a);
int main()
{
int *p;
int a;
p=test(3);
a=*p;
a=*p;
a=*p;
a=*p;
printf("%d\n",*p);
printf("%d\n",*p);
return 0;
}
int *test(int a)
{
int *p=&a;
return p;
}

在如上代码中 对a赋值多次 p的地址都是有效的
但是为什么在调用一次printf后 对p的间接引用却是无效的
...全文
161 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
尚书左仆射 2016-06-02
  • 打赏
  • 举报
回复
要是想在函数内部创建一个在全局可用的变量,可以用new操作符。
赵4老师 2016-06-02
  • 打赏
  • 举报
回复
栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时,会自动执行其析构函数,……
paschen 2016-06-02
  • 打赏
  • 举报
回复
有效最多能说明运气好,调用prinft后无效因为printf函数参数以及内部变量需要在栈上开辟空间,将你之前的值覆盖了
七擒关羽 2016-06-02
  • 打赏
  • 举报
回复
房东租给你了一间房子,配了一把钥匙给你,结果到期了,你还占着房子以为是你的,结果房东找到了新租客,你的东西全被房东扔了,然后你还理直气壮的拿着钥匙问为什么。
ghx287524027 2016-06-02
  • 打赏
  • 举报
回复
行为未定义,anything is possible
  • 打赏
  • 举报
回复
在调用了int *test(int a)函数之后,内存被释放,但是此处,虽然*p指向已经被释放区域,但是此处内存可能没有被覆盖,等到第二次打印的时候也许此处内存被覆盖了,所以打印会出现任意情况
encoderlee 2016-06-01
  • 打赏
  • 举报
回复
test函数返回后局部变量销毁,但是仍然有指针指向这块内存,这块内存随时有可能被修改成不同的内容,所以得到了不确定的结果
liu347182558 2016-06-01
  • 打赏
  • 举报
回复
所以如果换一个编译环境的话结果可能完全不一样是吗?
小灸舞 版主 2016-06-01
  • 打赏
  • 举报
回复
本来就是一个未定义的行为,发生什么结果都不奇怪。
毕竟你让p指向了一个形参的地址(局部变量)

69,382

社区成员

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

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