调用栈

✍ dations ◷ 2025-12-04 02:04:40 #计算机编程

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

相关

  • 教养教养(parenting)也称为养育或育儿,是指促进及支持儿童的体适能、情绪、社会及智力的发展,从婴儿期间一直拓展到成人。教养也就是将一个儿童培养成长成成人的过程。父母的教养方
  • Y染色体Y染色体是属于XY性别决定系统的大多数哺乳动物(包括人类)的两条性染色体之一。在哺乳动物的Y染色体中含有的SRY基因能触发睾丸的生长,并由此决定雄性性状。人类的Y染色体中包含
  • 同心圆在几何学里,同心的物体的中心或中心轴都在同一位置。圆圈、圆球、圆柱、圆环,都可以是同心的。称同心的圆圈为同心圆,同心的圆球为同心球,同心的圆柱为同心柱,同心的圆环为同心环
  • 苋属苋属(学名:Amaranthus)植物是一类分布广泛的草本植物,包含了大约70个种,常统称为野苋菜。其普遍特征是花序和叶子会呈现出不同程度的紫红色到金色。该属有一些种被认为是有危害
  • 布什山脉坐标:84°57′S 179°30′E / 84.950°S 179.500°E / -84.950; 179.500布什山脉(英语:Bush Mountains)是南极洲的山脉,位于杜费克海岸,属于毛德王后山脉的一部分,处于拉姆西冰川和
  • 军人保障标识牌军人保障标识牌,是中国人民解放军集军人保障卡、电子伤票、身份标识等等应用于一体的标识牌,是中国人民解放军军人平时和战时辨别身份的标识。2013年11月,经中央军委批准,中国人
  • 成始终成始终(1403年-?),字敬之,直隶常州府无锡县人,明朝政治人物。应天府乡试第三十六名。正统四年(1439年)己未科进士,授行人司行人,升监察御史。土木之变期间,督兵紫荆关,守要害地。累官湖广
  • 卡莱亚卡莱亚(尼泊尔语:कलैया)是尼泊尔的城镇,位于该国东南部,由纳拉亚尼专区负责管辖,距离与印度接壤边境14公里,面积18.98平方公里,海拔高度103米,2011年人口42,826。
  • 动画秘密花园《动画秘密花园》,又译《神秘花园》、《神秘的花园》,是在NHK综合频道所播映的日本电视动画作品,改编自英国作家法兰西丝·霍森·柏纳特的作品《秘密花园》(),自1991年4月19日播至
  • 蒙古文 (Unicode区段)蒙古文Unicode区段是包含胡都木蒙古文、托忒蒙古文、满文、锡伯文字符的Unicode区段。:528其书写方向为 由上至下,并由左至右。在Unicode官方的字符表中该区段的字符被逆时针