【发布时间】:2012-10-23 07:37:33
【问题描述】:
请考虑以下代码:
#include <stdio.h>
int main()
{
static int counter=5;
printf ("Counter = %d\n", counter);
if (counter--)
{
main();
}
return 0;
}
编译:
gcc test.c -ansi -Wall –pedantic
执行:
[root@mars home]# ./a.out
Counter = 5
Counter = 4
Counter = 3
Counter = 2
Counter = 1
Counter = 0
这里 main() 调用它自己()。
似乎main()函数的原始stackframe每次被自己调用main()都会被覆盖。
但是返回地址是什么?函数可以返回到自己的堆栈帧吗?
请帮我澄清这个疑问。
谢谢。
【问题讨论】:
-
int counter被声明为static,因此不分配在函数的堆栈上,而是分配在全局堆上。 -
除此之外,堆栈不会被覆盖。每次调用函数时都会压入一个新堆栈,并在返回时再次弹出
-
@alk 我不小心投了赞成票。静态变量既不在堆栈也不在堆中分配。它们通常位于数据段中,具有用于初始化和未初始化(BSS)的不同部分。但是,这可能因实现而异。
标签: c main stack-frame