求一个delphi堆栈溢出的实现源码
RT,谢谢。 啥是堆栈溢出源码,楼下解答一下 路过随手回答一下,不是搞delphi的。**堆栈**是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为**后进先出(LIFO)**队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。
**堆栈溢出**的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。**堆栈溢出**很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。
找了个delphi的递归给楼主参考一下,据我的经验,**只需要干掉递归出口**(去掉`if i<10 then`的语句),就能实现堆栈溢出了。其他部分需要楼主自行研究了。
```delphi
{递归调用的简单示例}
procedure alert(i: Integer = 1);
begin
ShowMessage(IntToStr(i)); {这是方法的功能}
Inc(i);
if i<10 then
alert(i); {这是方法自调用}
end;
{测试}
procedure TForm1.Button1Click(Sender: TObject);
begin
alert; {会连续弹出 9 个对话框, 分别提示 1..9}
end;
``` 本帖最后由 Cool_Breeze 于 2021-5-28 11:30 编辑
C# 数组维度超过了支持的范围。
using System;
using System.Collections;
class Program
{
static void Main()
{
Stack infinityStack = new Stack();
decimal count = 0;
while (true)
{
count++;
try
{
infinityStack.Push("ooo");
}
catch (Exception e)
{
// count 1,6777,2161
// System.OutOfMemoryException: 数组维度超过了支持的范围。
// 在 System.Collections.Stack.Push(Object obj)
// 在 Program.Main(), 167772161
Console.WriteLine("{0}, {1}", e, count);
break;
}
}
}
}
上面搞错了
Process is terminated due to StackOverflowException.
using System;
class Program
{
static void Main()
{
int count = 0;
Add(count);
}
static int Add(int count)
{
return Add(count);
}
}
using System;
class Program
{
static void Main()
{
int count = 1;
Console.WriteLine(Add(count));
}
static int Add(int count)
{
int status = 0;
if (count < 50000)
{
// count = 15885 进程报错
// Process is terminated due to StackOverflowException.
Console.WriteLine(count);
status = Add(++count);
}
return status+1;
}
}
页:
[1]