C语言在堆栈中实现函数的嵌套调用以及递鬼调用的全代码
时间: 2024-02-06 18:09:53 浏览: 29
以下是C语言在堆栈中实现函数的嵌套调用和递归调用的示例代码:
```c
#include <stdio.h>
// 嵌套调用函数
void funcA(int a) {
printf("进入函数funcA,a=%d\n", a);
funcB(a+1);
printf("离开函数funcA,a=%d\n", a);
}
void funcB(int b) {
printf("进入函数funcB,b=%d\n", b);
funcC(b+1);
printf("离开函数funcB,b=%d\n", b);
}
void funcC(int c) {
printf("进入函数funcC,c=%d\n", c);
// 这里结束嵌套调用,回到funcB
printf("离开函数funcC,c=%d\n", c);
}
// 递归调用函数
int factorial(int n) {
// 递归结束条件
if (n == 0) {
return 1;
}
// 递归调用
int res = n * factorial(n-1);
return res;
}
int main() {
// 嵌套调用示例
funcA(1);
// 递归调用示例
int n = 5;
int result = factorial(n);
printf("%d的阶乘为%d\n", n, result);
return 0;
}
```
在堆栈中,每个函数调用都会在栈上分配一段内存空间,用于存储该函数的局部变量、参数、返回地址等信息。函数调用结束后,这段内存空间会被释放,栈顶指针回到上一个函数的栈帧。
嵌套调用的示例中,当程序执行到funcA函数时,会在栈上分配一段内存空间,用于存储a参数和返回地址。在funcA函数中又调用了funcB函数,此时又会在栈上分配一段内存空间,存储b参数和返回地址。类似地,当funcB函数又调用了funcC函数时,会再次在栈上分配一段内存空间,存储c参数和返回地址。当funcC函数执行完毕后,会从栈中弹出该函数的栈帧,回到funcB函数中继续执行。当funcB函数执行完毕后,同样会从栈中弹出该函数的栈帧,回到funcA函数中继续执行。最后,当funcA函数执行完毕后,整个函数调用过程结束,栈中的所有栈帧都会被释放。
递归调用的示例中,factorial函数在每次递归调用时都会在栈上分配一段内存空间,存储n参数和返回地址。当n为0时,递归结束,该函数返回1,并从栈中弹出该函数的栈帧,回到上一个函数中继续执行。当所有递归调用结束后,程序最终返回n的阶乘结果并退出。