调用栈

✍ dations ◷ 2025-06-30 07:49:37 #计算机编程

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

相关

  • 链球菌感染后肾小球肾炎急性增生性肾小球肾炎(Acute proliferative glomerulonephritis)是在肾小球(肾小球肾炎)、或肾小管中所产生的病症。它常见于细菌感染的并发症中,通常是由链球菌(脓疱病)所造
  • 知识的代价知识的代价(英语:The Cost of Knowledge)是一个由学者发起的运动,抗议学术期刊出版社爱思唯尔(Elsevier)的经营模式。 这个运动发起的主因是该出版社过高的收费,他们呼吁降低购买期
  • 盐湖盐湖可以指:
  • 南回归线南回归线(拉丁语:Capricorni tropicus、法语:tropique du Capricorne、西班牙语、葡萄牙语:tropico de Capricornio、英语:tropic of capricorn、德语:südlicher Wendekreis)是太
  • 附果附果(英语:Accessory fruit,或称为假果)指子房以外的其他之构造发育而成的果实称之为假果,而是由花萼、花冠,甚至是整个花体序参与发育而成的果实,其结构比正常果实复杂得多。相对
  • 伟大社会伟大社会(英语:Great Society),或译为大社会计划或大社会,是在1960年代,由美国总统林登·约翰逊和其在国会的民主党同盟提出的一系列国内政策。1964年,约翰逊发表演说,宣称:“美国不
  • 爱尔兰华人爱尔兰华人是指居住在爱尔兰的华人,不管其国籍为何。而国籍为爱尔兰的华人则称为华裔爱尔兰人。2011年爱尔兰华人的人口数量为17,832人,占爱尔兰人口总数的0.4%。根据《卫报》2
  • 甘尼特峰甘尼特峰(英语:Gannett Peak)是美国怀俄明州的最高点,海拔13,810英尺(4,210米)。它横跨弗里蒙特县和萨布莱特县的边界,位于温德河山脉的大陆分水岭旁。
  • 皮特·里基茨约翰·彼得·里基茨(John Peter Ricketts;1964年8月19日-)是美国共和党的一位政治人物。皮特·里基茨自2015年开始担任第40任内布拉斯加州州长。他在踏入政坛之前曾经是一名商人
  • 弗氏佐剂弗氏佐剂(Freund's adjuvant),是含有抗原的矿物油乳浊液,用来作为免疫刺激剂(英语:Immunostimulant),是用于动物实验的佐剂,可分为完全佐剂与不完全弗氏佐剂。完全弗氏佐剂(Freund's C