关于“静态变量不能跨函数使用”的一个疑问

来源:互联网 发布:mac机械键盘推荐 编辑:程序博客网 时间:2024/05/22 17:07
  在学习指针时,都会讲到如下实例来验证“静态变量不能跨函数使用”这一观点。

/*----------------------------------------------静态变量不能跨函数使用  2015.12.8----------------------------------------------*/#include <stdio.h>void f(int ** q){int i = 100;*q = &i;//2、q内存单元中存放的是p的地址, *q = &i//即把i的地址存入*q(即内存单元p)中}int main(void){int * p;f(&p);//1、调用f()函数,把指针变量p的地址拷贝到q内存单元中printf("%d\n", *p);//3、按照逻辑,此时p中的值为变量i的地址,所以*p等价于访问i变量,//但因为调用f()函数时在栈中开辟的i的存储空间在f()函数执行完毕时//已经释放了,所以此时p对于其内保存的地址所指向的内存单元没//有操作权限return 0;}

  按照注释的理解,最终*p对i的地址所指向的内存单元(i释放后就不能再说这块内存就是i了)不具有操作权限。但是在VC++ 6.0中的实验结果却显示更改i的值时,程序最终显示的就是i的值,与理论矛盾。



  对于最终结果输出的值与对应的i值相同我并不感到奇怪,因为虽然i变量对应的内存单元被释放了,但这块单元内部的值并不会立刻被改变,释放只是说明它可以被重新使用,所以,如果能够操作i变量对应的地址,那么就可以访问这块内存单元,读出其内部的值。于是我们的问题也就变成了:在f()函数中定义的变量i,随着f()执行完毕内存被释放后,其地址还可以被主函数操作吗?

  这个问题,看了很多帖子,却并没有找到满意的答案。。。


0 0
原创粉丝点击