You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改指定C#代码,用while循环触发Stack Overflow异常?

如何用C#触发Stack Overflow异常(基于你的循环代码修改)

你之前的代码是迭代式的while循环,它不会触发栈溢出的原因很简单:整个循环都在同一个方法栈帧里执行,没有不断新增的栈帧占用空间。而栈溢出的核心是递归调用导致栈帧不断累积,超过了栈的最大容量——你讲座里的代码应该是不小心用了递归而非迭代,才触发了异常。

咱们来修改代码,用递归替代迭代,就能复现StackOverflowException了:

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("Please enter your name.");
        string playerName = Console.ReadLine();
        // 调用递归验证方法
        ValidatePlayerName(playerName);
    }

    static void ValidatePlayerName(string playerName)
    {
        if (playerName.Length == 0)
        {
            Console.WriteLine("Don't be a ****, enter a name!");
            // 关键:递归调用自身,每次都会在栈上创建新的栈帧
            ValidatePlayerName(playerName);
        }
    }
}

为什么这段代码会触发栈溢出?

  • 栈的空间是有限的(C#默认栈大小约1MB),每个方法调用都会在栈上分配一个栈帧,用来存储局部变量、返回地址等信息。
  • 当你输入空字符串后,ValidatePlayerName会无限递归调用自己,每调用一次就新增一个栈帧。
  • 很快栈的空间就会被耗尽,CLR就会抛出StackOverflowException。

和你原来代码的核心区别

你的原代码是在Main方法的同一个栈帧里反复执行循环逻辑,栈不会有新的帧被添加,所以哪怕是无限循环,也只会占用CPU,不会触发栈溢出。而递归版本会持续消耗栈空间,直到超出限制。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:16:41