| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 480 人关注过本帖
标题:[转载]想象一下这个程序
只看楼主 加入收藏
anthony634
Rank: 6Rank: 6
来 自:西南交大
等 级:贵宾
威 望:24
帖 子:653
专家分:10
注 册:2006-6-8
结帖率:100%
收藏
 问题点数:0 回复次数:5 
[转载]想象一下这个程序
想象一下输出结果,不要用vc或者gcc试验哦!
面试的时候没有机器给你的




#include "stdio.h"

int *p = NULL;

int *fFun(void)
{
int i = 0;
return &i;
}

void subFun(void)
{
(*p)--;
}

void gFun(void)
{
int j;

for(j = 0;j<10;j++)
{
subFun();
printf("%d\n",j);
}
}


int main(void)
{
p = fFun();
gFun();
}
搜索更多相关主题的帖子: include return style 
2006-08-31 15:16
hao0716
Rank: 4
等 级:业余侠客
威 望:1
帖 子:353
专家分:222
注 册:2006-4-11
收藏
得分:0 
怎么是这个呢?奇怪啊 全是-1 偶就算出来第一个是-1
...........
求解

2006-08-31 16:21
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

这是个面试题?
没多大意思。
变量i在fFun被调用时被分配,函数结束后,i的空间被回收,但其地址却被当成返回值返回。再调用gFun函数,变量j被编译器分配了原来i所在的空间。所以通过对*p的操作,也就能实现对j的操作,所以j被赋为-1,也就一直打印-1,形成死循环。


对不礼貌的女生收钱......
2006-08-31 16:32
anthony634
Rank: 6Rank: 6
来 自:西南交大
等 级:贵宾
威 望:24
帖 子:653
专家分:10
注 册:2006-6-8
收藏
得分:0 

主要考察对栈的熟悉。转人家的解析:先调用fFun()函数,调用时首先会将函数返回地址入栈,然后会将i入栈。最后函数返回的是i的内存地址,而这片内存被赋为0,函数退出后相应的参数出栈。然后进入gFun()函数,同fFun()一样,首先会将函数返回地址入栈,然后会将j入栈。而j的地址正是先前i的内存地址,所以指针p指向的就是j,执行j--,接下来,就会导致无限循环了...
用vc或者gcc确实是死循环phG
在keil c中,如果选择是 nooverlap,那么i和j是不会在一个空间上。

2006-08-31 17:02
ajey2004
Rank: 1
等 级:新手上路
帖 子:164
专家分:0
注 册:2004-12-30
收藏
得分:0 
好怪的题,不过挺有意思

2006-08-31 17:37
hao0716
Rank: 4
等 级:业余侠客
威 望:1
帖 子:353
专家分:222
注 册:2006-4-11
收藏
得分:0 
哇~~~~~原来是这样 看来我对C还有很多没了解 没把函数结束后,i的空间被回收这个考虑进去

2006-08-31 17:45
快速回复:[转载]想象一下这个程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026611 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved