从一次意外的堆栈溢出异常说开来 (一)

今天有一个朋友告诉我他的程序发生了StackOverFlowException

可是查来查去不知道为什么,就一段递归代码几个人阅读过似乎都没有问题

以下是简化版的代码 (真实的代码复杂很多,不过大意如下)

        static void Test(int i)
{
if (i > 20000)//或者其他退出条件
{
return;
}
Test(i + 1);
}

static void Main()
{
Test(0);
}


呵呵,大家能看出有什么问题么? 提示:逻辑上没有任何问题,也别在找什么语法错误

看起来逻辑是:这段代码没有死循环,20000次就退出嘛,

可是在实际运行中会抛出StackOverFlowException异常,

其原因是由于递CLR中默认堆栈大小是1M,

此程序不断的递归,每一级递归的方法都被压入了堆栈,当堆栈大小达到1M的时候,StackOverFlowException就抛出了

在我的机器上i运行到15918的时候抛出了堆栈溢出

大家可能觉得 要递归10000多次呢,看起来应该不会有什么问题吧

其实只要不小心,小几百次的递归就会出异常。

稍后演示这种情况。。。

原文地址:https://www.cnblogs.com/PurpleTide/p/2186596.html