在c#中使用单一方法是否会发生Stackoverflow异常?

在c#中使用单一方法是否会发生Stackoverflow异常?,c#,stack,stack-overflow,C#,Stack,Stack Overflow,当递归调用一个方法(无限次)时会发生堆栈溢出异常(每个递归调用分配不同的堆栈帧,在这种情况下使用多个堆栈帧)。正如我们所知,每个方法调用分配一个堆栈帧。使用单个方法(使用单个堆栈帧)可以溢出堆栈吗 使用单一方法是否可以溢出堆栈 当然可以: static不安全的void Main() { 对于(int i=0;iFoo(); 静态void Foo()=>Bar(默认值); 静态空心钢筋(FatStruct2097152‬ a) =>控制台写入线(a); } 结构FatStruct64{ 私人长型a

当递归调用一个方法(无限次)时会发生堆栈溢出异常(每个递归调用分配不同的堆栈帧,在这种情况下使用多个堆栈帧)。正如我们所知,每个方法调用分配一个堆栈帧。使用单个方法(使用单个堆栈帧)可以溢出堆栈吗

使用单一方法是否可以溢出堆栈

当然可以:

static不安全的void Main()
{
对于(int i=0;i<50;i++)
{
//我在i=18时失败
long*ptr=stackalloc long[10*1024];
}
}
当堆栈完全耗尽时,会发生堆栈溢出。有多种方法可以做到这一点;递归只是其中之一
stackalloc
在当前堆栈帧处创建指向内存块的指针(或最近:一个跨距),扩展当前堆栈帧;当您从分配它的方法返回(或抛出等)时,它将在概念上被回收(尽管实际上,这只是意味着更改一个数字)


另一种方法是创建一种尺寸过大的值类型:

静态类P
{
静态void Main()=>Foo();
静态void Foo()=>Bar(默认值);
静态空心钢筋(FatStruct2097152‬ a) =>控制台写入线(a);
}
结构FatStruct64{
私人长型a、b、c、d、e、f、g、h;
}
结构FatStruct512{
私人机构a、b、c、d、e、f、g、h;
}
结构FAT4096{
私人银行账户a、b、c、d、e、f、g、h;
}
结构FAT32768{
私人楼宇大厦4096 a,b,c,d,e,f,g,h ;;
}
结构FAT262144{
私人FAT32768 a、b、c、d、e、f、g、h;
}
结构FAT2097152{
私人金融资产负债表a、b、c、d、e、f、g、h;
}

“为每个方法分配了一个superate堆栈帧”-这是不正确的。为每个方法调用分配一个堆栈帧。溢出最常见的原因是没有合适的中断条件的方法调用自身。“当一个方法被递归调用(无限次)”-它不一定是无限的-只是“太多”参见ok cool,很多次可以用来让不太引人注目(而非
不安全
)的方法也足够快地实现它。标记-很好!我不记得是否对
struct
大小有限制,以及是否有限制,它离默认堆栈大小有多远,所以尽管您仍然需要收缩堆栈。。。但我现在懒得去尝试:)我对这个讨厌的东西(当然是FatStruct)的反应本质上是这样的,现在堆栈内存是堆栈帧内存的集合。如果一个新方法被称为堆栈帧,那么分配堆栈帧的实际意义是什么?(是将下一个块分配给新方法调用吗?@Nikhillchitneni堆栈帧不是“已分配”就是这样的—堆栈只是一个连续的内存块;没有块—它只是一个虚拟内存块;方法调用只是获取目标和参数所需的空间,(一定量)簿记空间,(一定量)方法声明的局部变量的空间,然后它只是增量(从技术上讲,递减-堆栈向下增长,原因是)指向该空间中当前语义框架的指针