牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2015-12-08 投稿人: 浏览次数:911
  在学习指针时,都会讲到如下实例来验证“静态变量不能跨函数使用”这一观点。

/*----------------------------------------------
	静态变量不能跨函数使用  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()执行完毕内存被释放后,其地址还可以被主函数操作吗?

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


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。