| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 611 人关注过本帖
标题:一次有趣的小实验,大家进来讨论一下!
只看楼主 加入收藏
东方罗密欧
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-10-22
收藏
 问题点数:0 回复次数:3 
一次有趣的小实验,大家进来讨论一下!
在学习C++的过程中,遇到了一个函数互调问题,即:函数互调问题。给个例子:
#include <iostream>
using namespace std;
int one(int x);
int two(int y);
int main()
{
    int i=1;
    one(i);                       //调用one(int x)函数
    return 0;
}
int one(int x)
{
    cout<<"one()执行了"<<x/2<<"次"<<endl;
    x++;
    two(x);                             //调用two(int x)函数
    return 0;
}
int two(int y)
{
    cout<<"two()执行了"<<y/2<<"次"<<endl;
    y++;
    one(y);                            //调用one(int x)函数
    return 0;
}


在主函数中调用了one(int x)函数,one(int x) 函数又调用了 two(int y)函数,同样的two(int y)函数里面又调用one(int x)函数,如此循环的调用下去,理论上这样可以无限循环,但是在编译的时候 最多每一个函数调用只执行了5871次!起初我以为是编译器(我用的是vc++6.0编译器)有“保护措施”,于是又写了一段无限循环的代码,代码如下:
#include <iostream>
using namespace std;
int main()
{
    int i;
    for(i=1;i!=0;i++)
    cout<<"执行了"<<i<<"次"<<endl;
    return 0;
}

编译这段代码的时候,是无限循环,一直执行了几十万次也没有停止。初步排除了计算机硬件(一般是指内存)的问题。然后又改成以下代码试了一下:
#include <iostream>
using namespace std;
int main()
{
    int i;
    for(i=1;i!=0;i+=1000000)
    cout<<"执行了"<<i<<"次"<<endl;
    return 0;
}
在i的值溢出的情况下,代码段仍然一直执行,然后基本排除了数据溢出导致函数互调停止的可能性。
现在问题出来了:
1:是什么问题导致函数互调停止的?
2:每个调用的函数执行次数跟哪些因素有关?还是一个确定的值?
搜索更多相关主题的帖子: 函数互调 
2008-11-29 20:17
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
函数调用需要占用堆栈空间,一旦堆栈空间用完,会产生stack OverFlow错误,然后程序退出,这个错误在直接运行的时候,有时候不会提示,只有在单步调试的状态下才会提示

对于你的两个问题

1.由于堆栈溢出导致错误,然后程序停止
2.可以通过增大堆栈空间增加调用次数,如果你用VC6
如果是英文版:
project -> setting -> link -> category 选择 output -> stack allocations 里面的 reserve 填入 0x10000000 然后选OK

如果是创天中文版:
工程 -> 配置 -> link -> "分类" 选择 Output -> "叠存分配" 里面的 "保留" 填入 0x10000000 然后选"确定"  ("叠存",我汗,这个创天中文是那个sb翻译的....)

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-11-29 20:29
东方罗密欧
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-10-22
收藏
得分:0 
谢谢你!忠心感谢!
2008-11-29 20:47
tangwen88
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2008-11-5
收藏
得分:0 
学习了
2008-11-30 18:11
快速回复:一次有趣的小实验,大家进来讨论一下!
数据加载中...
 
   



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

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