如何修改指定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
相关产品推荐
相关产品推荐

