C语言学习的疑惑,给看看,不难

int *name()
{int a=5;
int *s=&a;
printf("%d\n",*s);
return s;
}

main()
{
int *a=name();
printf("%d\n",*a);
}

为什么输出的都是5,name函数里面的变量应该是在栈区里面的吧,结束后不是就自动销毁了吗,返回给主函数也没用啊

在函数内的申明的引用和指针变量不能作为反回值,普通变量可以。 因为引用和指针变量是地址传值的,而在函数内申请的临时空间在函数结束时就被释放了 外部的引用或指针变量就没用指向了 而其他的普通变量是通过值传递的 没有传递地址 所以他们的临时地址被释放了 并不影响函数以外的变量

释放了,没错的。局部变量被销毁后,那块内存的数值将会变得不确定,是一个随机的值,可能还是原来的值,也可能是别值,还能输出5,不过是巧合罢了,那一刻那块内存保存的值刚好没有改变而已。你做多几次输出,你会发现,值不是5。