关于“静态变量不能跨函数使用”的一个疑问
在学习指针时,都会讲到如下实例来验证“静态变量不能跨函数使用”这一观点。
按照注释的理解,最终*p对i的地址所指向的内存单元(i释放后就不能再说这块内存就是i了)不具有操作权限。但是在VC++ 6.0中的实验结果却显示更改i的值时,程序最终显示的就是i的值,与理论矛盾。
/*---------------------------------------------- 静态变量不能跨函数使用 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 ", *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()执行完毕内存被释放后,其地址还可以被主函数操作吗?
这个问题,看了很多帖子,却并没有找到满意的答案。。。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。