学科分类
目录
C语言

函数的调用过程

程序在编译或运行时调用某个函数以实现某种功能的过程称为函数调用。在C语言程序中,遇到一个函数调用,系统就会跳转到函数内部执行这个函数,执行完毕后再跳转回来接着执行下一条指令。系统在函数调用之前可以保护好当前程序的执行“现场”,去执行函数,函数执行完毕后,再恢复当前程序的执行“现场”,这个过程类似于视频软件中的暂停与播放。

例如,定义一个函数func(),代码如下所示:

int func(int x, int y)
{
  return x+y;
}

如果在main()函数中调用func()函数,传入实参3和5,则func()函数的调用过程可使用图1描述。

图1 func()函数调用过程

图1描述了func()函数的调用过程,在这个调用过程中,编译器在背后做了很多工作:func()函数代码存储在代码区,编译器根据函数名找到函数入口地址,读取函数代码,根据函数代码在栈上分配相应的内存空间,将函数中的变量、数据、指令等存储在相应的内存区域中,例如func()函数中的形参x和y,编译器会在栈上为x与y分配相应的内存空间,这时x和y由形参变量变成了真正的变量。调用者传入的具体的数据“3”和“5”分别被存储到x和y标识的内存块中,即在函数调用时,形参获取实参的数据(相当于发生了赋值),该数据在本次函数调用中有效,一旦调用的函数执行完毕,形参的值占用的内存空间就会自动释放。

如果函数中有其他数据、指令等,编译器也会根据上下文环境为其分配适当的内存空间完成计算。函数所有代码执行完毕之后,编译器会收回为函数代码分配的空间,并清理现场,将函数返回结果通过指定的寄存器返回给调用者,调用者获取结果之后继续执行程序。

上面所述只是函数调用的大致过程,函数的调用过程非常复杂,涉及到内存管理、汇编、硬件等很多知识,在这里读者只需要了解函数调用大致过程即可,有兴趣的读者可以阅读程序运行原理相关书籍更进一步学习。

点击此处
隐藏目录