调用栈

✍ dations ◷ 2025-11-24 05:44:20 #计算机编程

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

相关

  • UTC-7UTC−07:00时区比协调世界时慢7小时,使用区域如下:
  • 米香型白酒米香型白酒指以桂林三花酒为代表的一类小曲米液,是中国历史悠久的传统酒种。是一种以大米为主要原料的蒸馏酒。米香型酒香气清柔,幽雅纯净,入口柔绵,回味怡畅,给人以朴实纯正的美
  • 氟化物氟化物指含负价氟的有机或无机化合物。与其他卤素类似,氟生成单负阴离子(氟离子F−)。氟可与除He、Ne和Ar外的所有元素形成二元化合物。从致命毒素沙林到药品依法韦仑,从难溶的
  • 樟山寺坐标:24°58′23″N 121°34′46″E / 24.9730897°N 121.57938°E / 24.9730897; 121.57938樟山寺位于台湾台北市老泉街,为主祀十八手观音之佛教庙宇,俗称十八只手。该建物兴
  • 内瓦尔热拉尔·德·内瓦尔(Gérard de Nerval,1808年5月22日-1855年1月26日)是法国诗人、散文家和翻译家,浪漫主义文学代表人物之一。热拉尔·德·内瓦尔的生活和一些作品受到一个名叫
  • 中心公园深圳市中心公园是中华人民共和国广东省深圳市福田区的一座公园。公园呈南北长条形分布,北接笔架山,南临滨河大道,南北长约2.5公里,东西最宽处约800米,占地123公顷。公园连接了由
  • 山猫山猫可以指:
  • 共识民主共识民主是共识决策法在民主制立法过程中的应用。它的特点是决策时涉及并考虑到尽可能广泛的意见,进而消除了少数派意见可能会被多数投票者忽略的缺陷。后者的结构被分类为多
  • 莫里斯·阿尔蒙德莫里斯·阿尔蒙德(英语:Morris Almond,1985年2月2日-),美国前职业篮球运动员,生于佐治亚州道尔顿(英语:Dalton, Georgia),司职后卫。高中时期于佐治亚州保德斯普林斯(英语:Powder Springs
  • 提庇留·朱利亚斯·阿布德斯·潘得拉提庇留·朱利亚斯·阿布德斯·潘得拉(拉丁语:Tiberius Iulius Abdes Pantera,约前22年-约40年),英文译为约瑟·本·潘得拉(英语:Joseph ben Pantera),一名罗马弓箭手士兵,1859年在德国