调用栈

✍ dations ◷ 2025-10-16 02:08:33 #计算机编程

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

相关

  • 指纹分析指纹是灵长类动物手指末端指腹上由凹凸的皮肤所形成的纹路,也可指这些纹路在物体上印下的印痕。当人的手指接触到物品时,指纹会增加手指与物品之间摩擦力,使人可以抓紧物体,而且
  • 拉丁-法利希语支拉丁-法利希语支是印欧语系意大利语族的一个分支,包括拉丁语和法利希语。这些语言在意大利和拉齐奥地区使用,之后拉丁语成为罗马帝国的唯一通用语言。法利希语的使用者逐渐减
  • 居里点居里点(Curie point)又作居里温度(Curie temperature,Tc)或磁性转变点。是指磁性材料中自发磁化强度降到零时的温度,是铁磁性或亚铁磁性物质转变成顺磁性物质的临界点。低于居里点
  • 台东县市区公车台东县市区公车包括绿岛乡、兰屿乡及台东市区之公车路线。绿岛乡公车由绿岛乡公共汽车管理所经营,兰屿乡公车由兰屿乡公共汽车管理所经营;台东市区公车(英语:TaiTung CITY Bus)Lo
  • 锦屏县锦屏县是中国贵州省黔东南苗族侗族自治州下属的一个县,清水江流贯。东经108°48'-109°24',北纬26°23'-26°16'。东临湖南省靖州苗族侗族自治县,西临剑河县,南临黎平县,北临天柱
  • 拟菌病毒属拟菌病毒属(学名:)是一个包括(APMV)的一个属,或许是与演化史相关的巨型病毒。通常所说的“拟菌病毒”就指APMV。在口语中,APMV更普遍简称为“米米病毒”(mimivirus)。2011年10月中旬,
  • 杜鹃科杜鹃科(学名:Cuculidae)在动物分类学上是鸟纲鹃形目中的唯一科。中国古代也称子规、杜宇等。许多分布于欧、亚、非洲的杜鹃科鸟类属于孵卵寄生动物,这些杜鹃从不筑巢,而是将卵产
  • 田中光四郎田中光四郎(田中 光四郎/たなか こうしろう ),1940年出生于福冈县田川市。日本古武术家,武术流派日子流的创始人。毕业于神奈川大学法律专业。田中光四郎4岁开始接触的柔道,从12
  • 高士鹏高士鹏(1851年10月24日-?年),字云程,号荫棠,陕西省城固县人,同治十二年(1873年)拔贡,光绪二十三年(1897年)署任四川邻水县知县,勤政爱民,任满士民立长生牌于清风亭,并竖“爱士勤民”德政碑。
  • 孟振生孟振生(Joseph-Martial Mouly, C.M. 1807年8月2日-1868年12月4日), 罗马天主教主教。1807年8月2日,孟振生生于法国,1831年4月2日晋升神父。1840年8月23日任蒙古代牧区宗座代牧。18