C语言指针 静态变量的调用

#include <stdio.h>
void f(int ** q)
{
int i = 5;
*q = &i;
}
int main(void)
{
int *p;
f(&p);
printf("%d\n",*p);
return 0;
}
疑问:VC6.0输出结果:5
f函数执行完毕,为f分配的静态变量也都会释放,那么q跟i也就都不存在,为何输出结果还为5???

1、首先注意你的函数f传进去的是指针的指针。函数体中int i = 5;这个i是在函数体执行结束后,他的作用域是结束了,所以i是被释放了

但是这个时候你要注意,只是i这个变量作用域结束了,但是i对应的内存区域存储的5的内存块并没有被清理。而且*q = &i这句是将5的内存块的地址赋值给了指针的指针q了,所以这个时候很q就指向了内存中存储5的这个内存块。

理解了为什么输出为5么?欢迎讨论。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-29
首先你这里没有用到静态变量(没有static int i=5),而是auto的。
其次函数执行完毕静态变量不会释放,auto的才会,但是这个所谓释放只是栈指针的移动,并没有涉及到内存的malloc/free,它的地址仍然是“合法”的(在同一个线程地址空间中),虽然不那么合理。本回答被提问者采纳
第2个回答  2010-07-29
是的i被释放了,但i原来使用的内存区域内容还没被重新使用或分配,那么里边存放的5也就还存在,p就指向了这个地址,所以打印出来就是5.

不过注意,实际软件中不要这么写,因为p指向的内存区域是已经释放了,所以引用p的行为是不可预测的!
第3个回答  2010-07-29
楼上几位分析都有道理,但实际中千万别出现这样的代码。C语言对指针的有效性几乎没有什么检查,全靠程序员自己负责。严格说来,这样的程序是有危险的,访问了不该访问的内存。
相似回答