吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1321|回复: 3
收起左侧

[求助] 求一个delphi堆栈溢出的实现源码

[复制链接]
冥界3大法王 发表于 2021-5-22 11:41
RT,谢谢。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lorzl 发表于 2021-5-22 14:06
啥是堆栈溢出源码,楼下解答一下
大侠在路上 发表于 2021-5-22 14:56

路过随手回答一下,不是搞delphi的。

堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。

堆栈溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆栈溢出很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。

找了个delphi的递归给楼主参考一下,据我的经验,只需要干掉递归出口(去掉if i<10 then的语句),就能实现堆栈溢出了。其他部分需要楼主自行研究了。

{递归调用的简单示例}
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;

免费评分

参与人数 1吾爱币 +2 收起 理由
冥界3大法王 + 2 谢谢@Thanks!

查看全部评分

Cool_Breeze 发表于 2021-5-28 10:54
本帖最后由 Cool_Breeze 于 2021-5-28 11:30 编辑

C# 数组维度超过了支持的范围。
[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.
[C#] 纯文本查看 复制代码
using System;

class Program
{
    static void Main()
    {
        int count = 0;
        Add(count);
    }
    
    static int Add(int count)
    {
        return Add(count);
    }
}


[C#] 纯文本查看 复制代码
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;
    }
}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 03:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表