调用栈

✍ dations ◷ 2025-08-02 14:33:23 #计算机编程

调用栈(英语: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)来获取程序的控制权。

相关

  • 粘土黏土,俗作粘土(均读作niántǔ),是有黏性的泥土,一般指颗粒小于2微米且可塑的多种含水硅酸铝盐矿物混合体(英语:Hybrid)。除了铝外,黏土还包含少量镁、铁、钠、钾和钙等元素。黏土一
  • 青葱青葱(英文:Scallion)是葱属中葱和洋葱的杂种,为球根性多年生草本植物,原产希腊。青葱和葱并不是同一种植物,其叶和茎比葱更软,地下部分为红褐色鳞茎。在西方主要用作沙拉的调味品。
  • 福布斯(2012年12月)《福布斯》(英语:Forbes)是美国一本商业杂志,由福布斯公司(Forbes, Inc.)发行,每两周发行一次,以金融、工业、投资和营销等主题的原创文章著称。福布斯还报导技术、通信
  • 沙国河沙国河(1934年5月7日-),中国物理化学家。生于四川成都。1956年毕业于北京石油学院。中国科学院大连化学物理研究所研究员。1997年当选为中国科学院院士。
  • 维西尔维齐尔(波斯语:وزير,一译华札尔、维奇尔、维西尔),清代译作倭色尔,指高级的行政顾问及大臣(有时涉及宗教),他们为穆斯林君主如哈里发及苏丹服务,有时可指波斯沙阿的大臣。在现代,维
  • 代理型孟乔森综合征代理型孟乔森综合征(Factitious disorder imposed on another)是指照顾者故意夸大或捏造受照顾者的生理、心理、行为或精神问题,甚或促成该等问题的心理疾病。。与孟乔森综合征
  • 卡达山-杜顺人卡达山-杜顺人,由卡达山人及杜顺人原住民联合而成,是马来西亚沙巴州内最大的达雅族群,大部分居住在沿海城市及内陆地区,如兵南邦(Penampang)、下南南(Inanam)、担布南(Tambunan)、哥打
  • 双氟苯丁哌啶苯并咪唑酮双氟苯丁哌啶苯并咪唑酮(Pimozide;哌迷清;匹莫齐特;商标名 Orap)是二苯丁基哌啶(英语:Diphenylbutylpiperidine)类的抗精神病药药品。它于1963年由杨森制药公司(英语:Janssen Pharmace
  • 乘积法则乘积法则,也称积定则、莱布尼兹法则,是数学中关于两个函数的积的导数的一个计算法则。若已知两个可导函数 f , g {\displayst
  • 黄之隽黄之隽(1668年-1748年),初名兆森,字若木、石牧,号吾堂,晚号石翁、老牧。松江府华亭县人,清朝官员。早年科举不顺。康熙五十年在广西巡抚陈元龙家教书为生。康熙六十年(1722年)中式丁丑