为什么在不同的呼叫号码上抛出堆栈溢出异常?

时间:2013-06-15 07:17:24

标签: c# recursion stack-overflow

考虑以下代码:

    private static int i = 0;

    static void Main(string[] args)
    {
        DoSomething();
        Console.ReadLine();
    }

    public static void DoSomething()
    {
        Console.WriteLine(i);
        ++i;
        DoSomething();
    }

每次运行时,我都会StackOverflowException获得i变量的不同值。例如 16023 16200 16071

这背后的原因是什么?这是C#编译器中的错误吗?

2 个答案:

答案 0 :(得分:4)

无界递归的行为是实现定义的。实现定义意味着它可以执行任何。程序可以随时终止(或永不终止),抛出未处理的异常,或其他任何东西。例如,编译为MSIL并在64位操作系统上运行,程序永远不会终止。这是因为允许抖动将递归转换为64位抖动所做的循环。询问为什么它终止于特定值没有实际意义,因为允许运行时任何

答案 1 :(得分:1)

你的stacksize还不够大。

您可以通过启动新线程并在构造函数中定义新的stacksize来增加默认堆栈大小:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication3
{
class Program
{
    private static int i = 0;

    static void Main(string[] args)
    {
        Thread T = new Thread(DoSomething, 100000000);
        T.Start();
        Console.ReadLine();



    }

    public static void DoSomething()
    {
        Console.WriteLine(i);
        ++i;
        DoSomething();
    }

 }
}

Stackoverflow现在发生了150万次递归调用。