标题:[转载]想象一下这个程序
只看楼主
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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-87191-1-1.html




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

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