hellohuan

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  2 Posts :: 3 Stories :: 0 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

程序如下:
#include <iostream>
using namespace std;


void fuck(int *&j)
{
int l = 20;
int *k = &l;
j = k;
k = 0;
}

void any_function_use_local_variables()
{
int a, b, c;
a=b=c=100;
}

int main()
{

int i = 10;
int *j = &i;

fuck(j);
/////-------------------------
cout < <*j < <endl;   
////-------------------------
cout < <*j < <endl;

any_function_use_local_variables();
////-------------------------
cout < <*j < <endl;
//
cout < <*j < <endl;

return 0;
};


打印结果,四次cout < <*j < <endl;结果都不同,依次是:
20
274148040
-858993460
274148040
这个我开始就不太明白了,明明fuck了局部变量为什么还能得到20的值,j应当指向一块不确定的内存区域,却有了几次不一样的结果。
于是在论坛里面贴了出来,自己也查了很多资料试验了很多程序。
原因我的理解基本是这样:
第一个输出时因为是刚刚返回 ,虽然局部变量销毁了.
(我的理解销毁:就是我放弃了这个地方了.原来我在那放了一个苹果,在没人用这块地方时苹果还在)
所以第一个输出还是20。之后这块内存应该被用过了,所以变成了其它的值。
下面是一位牛人的回复,挺有道理!
///////////////////
第一次输出:在void fuck(int *&j) 函数中,声明的局部变量K,假设地址为oxff71,在函数中,这个地址赋值给了j;
然后,函数中的局部变量K所指的内存的值为20;然后,fuck函数结束,局部变量的内存被释放,单这个释放只是说明了这块内存可以被重新使用,并不是把内存里的数值归0了,所以。在第一次输出的时候,*j为20;

第2次输出:其实cout < <也是调用了一个函数,这个函数怎么实现我并不知道,但是有理由相信,在这个函数中是要使用一些局部变量的,那么当第一次输出了*j以后,这个函数或许没有结束,它里面的局部变量使用了刚刚fuck释放的那块内存,然而又有局部变量使用了oxff71这个地址,但是变量J所指的地址也正好是这样,所以,输出了另一组数字。

第3次输出:在调用了any_function_use_local_variables()这个函数后,其实我们可以把any_function_use_local_variables 这个函数简化下, 简化成下面这样
void any_function_use_local_variables()
{
int a=10;
int b =100;
}
通过代码跟踪调试可以知道,any_function_use_local_variables函数还是使用了fuck释放的内存,因为我们可以清楚的看到 b的地址是oxff71,所以第3次输出的就是100了。

其实我们可以在3个cout < <*j < <endl以后在加一个 cout < <*j < <endl,可以看到第4个输出和第2个输出是一样的,从而就证明了我对第2次输出的猜想。


posted on 2008-07-29 21:08 炮灰九段 阅读(71) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理