C语言中存储空间分配问题

看书上说声明的变量只是在函数存在的时间有效,函数返回时就会被释放。
然后我就试了一下,代码如下:

#include<stdio.h>
int f(int **iptr)
{
 int a=10;
 *iptr=&a;
 return 0;
}
int main()
{
int **jptr;
f(jptr);
printf("%i\n",**jptr);
}

按理说不应该是f函数结束后变量a就会被释放,此时*iptr应该是一个悬空指针啊,为什么我编译运行程序的时候
还是可以输出a的值为10,谢谢啦,这里不是很理解。

释放并不代表清空该内存。
只是将此内存归还给操作系统。
指向的内存标记为*可用*,操作系统掌控,内容没有意义.不会主动变化(清0).直到再次分配后可能又会用到这部分.
(可能也和内存分配回收策略有关,出于效率考虑)

楼主这样的做法属于未定义的行为,如果你访问的区域已经重新被别的变量使用,那么可能导致程序崩溃

释放和清零是两个概念,释放只是说明这个内存可以被再次使用,好比你删除文件。文件删除了,但是写文件的扇区不会被清零,如果没有新的数据写入,你还可以用文件恢复软件找回删除的文件。

1.a 是被释放了没有错的;
2. f 传参是传入的一个地址,在里面把a的地址给它了;
3.所以你后面输出的就是在f里传来的值;

的确是释放了,但是不会被清零。因为你没有调用别的函数,堆栈收缩了,所以堆栈顶上的值没有被别的数据覆盖,还能访问。

C语言的指针可以随便访问,它才不管这些内存是否合法,不要说访问释放过的内存,就是压根没有申请的内存都可以:
int x = 1;
int *p = &x + 1; //明显这个指针指向的这个地方根本不是一个变量。