调用栈

✍ dations ◷ 2025-07-11 07:47:23 #计算机编程

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

相关

  • 乳杆菌属见内文乳杆菌属(Lactobacillus)即为乳酸杆菌,是一群存在于人类体内的益生菌。乳杆菌因能够将碳水化合物发酵成乳酸而得名,可用于制造液态酸奶、固态奶酪、德国酸菜、啤酒、葡萄
  • 梓官区梓官区(台湾话:.mw-parser-output .sans-serif{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Lato,"Helvetica Neue",Helvetica,Arial,sans-serif} Tsú-
  • 理察·费曼理查德·菲利普斯·费曼, ForMemRS,英文名 Richard Philips Feynman ,(1918年5月11日-1988年2月15日),美国理论物理学家,以对量子力学的路径积分表述、量子电动力学、过冷液氦的超
  • 农业机械部中华人民共和国农业机械部是的中华人民共和国国务院原有的一个组成部门,主管农业机械事务,1959年8月成立农业机械部。1970年7月1日并入第一机械工业部为农机局。1965年1月改称
  • 张云松张云松(1977年3月20日-),北京人,中国篮球运动员,职业生涯仅效力于北京金隅队一支球队。现担任中国篮球特体队教练。张云松1987年进入北京市东城区体校进行专业训练,是从其启蒙教练
  • 意大利政府首脑列表意大利政府首脑,现在正式名称为“部长会议主席”(意大利语:Presidente del Consiglio dei Ministri),中文又称“意大利总理”,是意大利共和国的最高行政首长,负责领导部长会议(内阁)
  • 元嘉 (刘宋)元嘉(424年—453年)是南朝宋皇帝宋文帝刘义隆的年号,共计29年余。由于宋文帝的儿子刘劭弑父自立改元太初,后刘劭兵败被杀,刘骏即位。通常的帝系表将其后继位改元孝建的宋孝武帝当
  • 阿尔弗雷德·阿佩尔阿尔弗雷德·阿佩尔 (英语:Alfred Appel, Jr., 1934年1月31日-2009年5月2日) 是研究弗拉基米尔·弗拉基米罗维奇·纳博科夫的专家,也喜好现代艺术和爵士乐。作为康奈尔大学校友,阿
  • 爱在旭日升起时《爱在旭日升起时》(英文:Emerging Light)是一部描写张廷旭真实人生电视剧,全剧共5集,于2012年11月5日-2012年11月9日在大爱电视《长情剧展》时段(台湾时间星期一~星期五晚上22:00)
  • 黄洋站黄洋站是位于四川省广元市旺苍县黄洋乡的一个铁路车站,邮政编码628206。车站建于1981年,有广巴铁路经过该站,现仅办货运业务,不办理客运业务。车站距离广元南站74公里,隶属成都铁