调用栈

✍ dations ◷ 2025-11-29 11:19:36 #计算机编程

调用栈(英语:Call stack,港台称“呼叫堆叠”,英文直接简称为“栈”(the stack))别称有:执行栈(execution stack)、控制栈(control stack)、运行时栈(run-time stack)与机器栈(machine stack),是计算机科学中存储有关正在运行的子程序的消息的栈。有时仅称“栈”,但栈中不一定仅存储子程序消息。几乎所有计算机程序都依赖于调用栈,然而高级语言一般将调用栈的细节隐藏至后台。

调用栈最经常被用于存放子程序的返回地址。在调用任何子程序时,主程序都必须暂存子程序运行完毕后应该返回到的地址。因此,如果被调用的子程序还要调用其他的子程序,其自身的返回地址就必须存入调用栈,在其自身运行完毕后再行取回。在递归程序中,每一层次递归都必须在调用栈上增加一条地址,因此如果程序出现无限递归(或仅仅是过多的递归层次),调用栈就会产生栈溢出。

调用栈的主要功能是存放返回地址。除此之外,调用栈还用于存放:

以下MIPS汇编语言程序计算 3 2 + 4 2 {\displaystyle 3^{2}+4^{2}} ,并将结果存至寄存器s0

main:    li      $a0, 3    li      $a1, 4    jal     sumsq    move    $s0, $v0    j       mainendsumsq:    addi    $sp, $sp, -4        # 在堆疊上分配空間    sw      $ra, 0($sp)         # 將sumsq的返回位址存入堆疊中    jal     square    move    $t0, $v0    move    $a0, $a1    jal     square    add     $v0, $v0, $t0    lw      $ra, 0($sp)         # 從堆疊中取回sumsq的返回位址    addi    $sp, $sp, 4         # 釋出堆疊上分配的空間    jr      $rasquare:    mult    $a0, $a0    mflo    $v0    jr      $ramainend:

这里,主程序(main)调用“sumsq”子程序并将返回地址存入寄存器ra,但是“sumsq”子程序需要调用“square”子程序。为保证sumsq的返回地址不被重写,这个地址被存储在栈中。在square子程序返回后,sumsq再从栈中取回其自身的返回地址。

在较底层语言(如汇编语言与C语言中),程控消息与数据可能一同被存入调用栈中,因此造成安全隐患,可能允许恶意程序通过栈缓冲区溢出(stack buffer overflow)来获取程序的控制权。

相关

  • 窥视症窥淫癖、窥阴癖(英语:voyeurism)意指一个人喜欢借由偷看他人更衣、裸体或性行为而得到性快感的行为;这种行为不被社会接受。偷窥者要在被偷窥者不知情的情况下,才会得到快感。患
  • 弗雷德里克·莱因斯弗雷德里克·莱因斯(英语:Frederick Reines,1918年3月16日-1998年8月26日),美国物理学家,加州大学尔湾分校教授,因为对中微子检测的贡献获1995年获诺贝尔物理学奖。1918年3月16日,出
  • 化学机制化学中,反应机理用来描述某一化学变化所经由的全部基元反应。虽然整个化学变化所发生的物质转变可能很明显,但为了探明这一过程的反应机理,常常需要实验来验证。机理详细描述了
  • 银河系的卫星星系银河系有一些较小的受到重力约束的星系,它们是银河系次星系群的一部分,这个次集团又是本星系群的一部分。大约有30个小星系已经证实是在银河系的420 千秒差距(140万光年)之内,虽
  • 亨利班提育亨利班提育(缅甸语:ဟင်နရီဗန်ထီးယူ,Henry Van Thio或是Henry Van Hti Yu,1958年8月9日-),缅甸第二副总统,全国民主联盟成员。亨利班提育为钦族人,他曾在缅甸军队中服役
  • cmuscmus(C* Music Player)是一个小型、快速的面向类Unix系统操作系统的控制台式音频播放器。cmus以GNU通用公共许可证(GPL)条款分发,并只通过内置的ncurses以基于文本的用户界面(英语
  • 2-氨基乙硫醇2-氨基乙硫醇是一种用于治疗多种疾病的药物,经FDA批准用于治疗胱氨酸症,可口服或作为滴眼液成分。硫化氢与氢氧化钠的甲醇溶液反应,得到的新溶液和2-氯乙胺盐酸盐反应,可以得到2
  • 野口敏治野口敏治(1889年5月21日-1944年1月14日),神奈川县橘树郡小机村(今横滨市港北区)人,东京帝国大学政治科毕业,日本昭和初期之日本政府官员。野口敏治于1933年8月4日接替中濑拙夫,从高雄
  • 弧度 (空气动力学)机翼的上表面与下表面距离之间一半的点连线称为中弧线(mean camber line)或弧线(camber line)。而弧度(camber,又称弯度),是弧线与翼弦线间最大的距离。弧度由翼弦量起,往上为正,往下
  • 世姓世姓,汉字姓氏之一,为锡兰科堤王朝王子世利巴交喇惹后裔。1411年(明朝永乐9年),郑和下西洋,回程途经锡兰罗依伽摩王国,国王维罗·阿罗吉湿婆罗(《明史》译作亚烈苦奈儿)欲予加害,郑和