调用栈(英语:Call stack,英文直接简称为“栈”(the stack))别称有:执行栈(execution stack)、控制栈(control stack)、运行时栈(run-time stack)与机器栈(machine stack),是计算机科学中存储有关正在运行的
子程序的消息的
栈。有时仅称“栈”,但栈中不一定仅存储子程序消息。几乎所有
计算机程序都依赖于调用栈,然而
高级语言一般将调用栈的细节隐藏至后台。
调用栈最经常被用于存放子程序的
返回地址。在调用任何子程序时,主程序都必须暂存子程序运行完毕后应该返回到的地址。因此,如果被调用的子程序还要调用其他的子程序,其自身的返回地址就必须存入调用栈,在其自身运行完毕后再行取回。在
递归程序中,每一层次递归都必须在调用栈上增加一条地址,因此如果程序出现无限递归(或仅仅是过多的递归层次),调用栈就会产生
栈溢出。
这里,主程序(main)调用“sumsq”子程序并将
返回地址存入寄存器ra,但是“sumsq”子程序需要调用“square”子程序。为保证sumsq的返回地址不被重写,这个地址被存储在栈中。在square子程序返回后,sumsq再从栈中取回其自身的返回地址。
在较底层语言(如
汇编语言与
C语言中),程控消息与数据可能一同被存入调用栈中,因此造成安全隐患,可能允许恶意程序通过
栈缓冲区溢出(stack buffer overflow)来获取程序的控制权。