伪码:
void 0001() {  0002(); }
void 0002() {  0003(); }
void 0003() {  0004(); }
... 一直喊 ...
void N-1() {  N (); }
void N()   {  再喊下去就出问题了 }
这个N 值总不可能没有限制,最多是多少?
是固定值,还是与硬件有关?

解决方案 »

  1.   

    汇编就是 call 一个地址,应该是无限次吧
      

  2.   


    call指令本身会push esp,ebx等寄存器值到栈上,栈是有限的,push就不能无限。
      

  3.   

    看了标题进来,LZ的拟人描述够恰当的这个问题不用费那么多笔墨描述,直接问递归可以嵌套多少层是一样的。
    每次函数执行都涉及压栈(调用)和出栈(返回),压栈压的是参数和返回地址,反之亦然。在函数调用未返回的情况下,就要持续占用栈空间,所以能嵌套多少层要看线程栈的大小。持续压栈而不出栈,就会造成线程栈溢出,一般编程中遇到的stack overflow错误就这个意思。线程栈在未特殊设置时有默认值,开发者也可在stack allocation中自定义设置。
      

  4.   

    恩, 你可以试试啊。 
    我刚试了。 试验环境VC6.0哈。
    试验代码如下://传一个参数
    #include <iostream.h>
    #include <fstream.h>ofstream outFile("test.txt");
    void  Func(unsigned int a/*, unsigned int b, unsigned int c*/)
    {
    outFile<<a<<endl;
    a++;
    Func(a/*,a,a*/);
    }int main()
    {
    unsigned a=0;
    Func(a/*,a,a*/);
    return 0;
    }发现test.txt的最终值为11754
    //传入两个参数
    #include <iostream.h>
    #include <fstream.h>ofstream outFile("test.txt");
    void  Func(unsigned int a, unsigned int b/*, unsigned int c*/)
    {
    outFile<<a<<endl;
    a++;
    Func(a,a,/*a*/);
    }int main()
    {
    unsigned a=0;
    Func(a,a/*,a*/);
    return 0;
    }发现test.txt的最终值为11243这样你就可以计算编译器为该程序分配的栈啦。
    设入栈字节数为:函数传入字节+X(保存现场的其他字节,如指令指针等)
    设该程序的栈大小为Y字节。
    解二元一次方程: (4+X)*11754=Y; (8+X)*11243=Y;
    解得:X=84; Y=1034352;现在你就可以猜猜传入3个参数的时test.txt的最终值应为10774由此可见递归次数(就是你说的“喊”的次数)与程序的栈大小有关。
    VC 6.0编译器默认为应用程序分配1MB的栈空间。
      

  5.   

    VC++ debug下2000重就会崩溃。
      

  6.   

    不错栈用光就完了。这是由操作系统和编译器决定的。
    -----------------------------------------------
    VC6可更改栈大小
    Project->Setting->Link,在Category 中选中Output,在Reserve中设定堆栈的最大值和commit;linux 方便些,好象可设1G。
      

  7.   

    肯定会有所限制的...要不很多人也不会不建议用递归来实现等...Call会把参数给压入堆栈的..
      

  8.   

    栈溢出为止。在Visual Studio 工具中可以设置栈的大小。当函数调用时,需要保存现场到栈中(push),待返回时再恢复现场(pop),故无限递归调用函数会不停push,而不pop。故会栈会溢出。编译器的优化问题,估计不会,我写过一个图像处理的程序,递归深度较深,会出错,修改栈的大小后就可以了。