调用栈

✍ dations ◷ 2025-05-19 14:07:12 #计算机编程

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

相关

  • 循环性情感症循环性情感症(Cyclothymia)是情感障碍之一、躁郁症的一种形式。在极性病谱中有定义此症。具体而言,此疾患属于较轻微形式的第二型双极性疾患,伴随着时常在欢欣鼓舞与低落沮丧之
  • 检疫隔离检疫 是风险管理的一种设施。 当人类、动物、植物等,由一个地方进入另一个地方,为防带有传染病等,所以必须进行隔离检疫。本条目出自公有领域:Chisholm, Hugh (编). Quarant
  • 高兴高兴(high)即快乐的情绪,另可能指:
  • 春秋决狱春秋决狱是中国古代在审判案件时的一种断狱方式,司法官根据《春秋》的义理来判断案件如何定罪。春秋决狱从汉武帝时代开始,直至唐朝儒家思想和法学完全结合在一起,“礼法合一”
  • 长期的长期变化是时间系列在长时期的非周期变化(参见分解时间系列)。无论何者被查觉是长期变化或是与时间尺度无关:在超越世纪的时间尺度上,长期变化在数百万年的时间尺度下可能是周期
  • 外婚制外婚制是早期部落时代的一种婚姻规定,某人只被允许在自身氏族、文化或者社会团体之外选择配偶。部落内部不同氏族可以结婚,而同一氏族男女不为配偶。中国在西周时期称之为同姓
  • 摩尔多韦亚努峰摩尔多韦亚努峰 (罗马尼亚语:Vârful Moldoveanu 发音:.mw-parser-output .IPA{font-family:"Charis SIL","Doulos SIL","Linux Libertine","Segoe UI","Lucida Sans Unicode"
  • 格奥尔基·费奥多罗维奇·亚历山德罗夫格奥尔基·费奥多罗维奇·亚历山德罗夫(俄语:Гео́ргий Фёдорович Алекса́ндров,1908年3月22日(4月4日)-1961年7月21日)是苏共中央宣传部部长(1940年-1
  • 拉齐维乌家族拉齐维乌家族(波兰语:Radziwiłł;白俄罗斯语:Радзівіл, Radzivił;德语:Radziwill;拉丁语:Radvil;立陶宛语:Radvila)是一个出身于立陶宛的国际性家族。其也是先在立陶宛大公国
  • 国歌 (立陶宛)《国歌》(立陶宛语:Tautiška giesmė)又名《立陶宛,我的祖国》(Lietuva, Tėvyne mūsų)、《立陶宛赞歌》(Lietuvos himnas),其曲词为1898年当立陶宛尚属于沙皇俄国时,由文萨斯·库