为什么函数在第二次调用的时候可以继续使用里面的局部静态变量?

#include <stdio.h>


void func_a() {
    static int a = 0;
    a++;
    printf("%d\n", a);
![clipboard.png](/img/bVUujO)

}

int main(int argc, char const *argv[])
{
    func_a();
    func_a();

    return 0;
}

clipboard.png

我想的是,函数func_a在调用完一次之后,栈空间就被释放掉了。虽然静态变量a仍然被保存在了某块内存中,但是,原来的栈空间保存的信息已经没了。那么问题就来了,第二次调用它是怎么知道这个变量a所在的位置?而且它是怎么知道就是上次调用的那个变量a

阅读 4.6k
4 个回答

虽然栈空间没了,但是函数的代码还在呀。a的地址是在代码段里写明的,它不是栈空间里的变量。

  • 函数是怎么知道a的位置?是编译器告诉它的。编译器把static a放在数据段以后记下地址,函数里面用到a的地方都编译成引用那个地址就好了。

  • 函数是怎么知道就是上次调用的那个变量?它知不知道没有关系。只要用那个数据段里面的地址的内容就好了。

函数内的static变量不在栈上 (你可以和栈上变量比较一下指针)。

基本上和文件级的static变量差不多,区别在于函数内才能访问。

在C中,函数中的静态变量不在栈空间而是在堆上存储的。需要注意的是java语言中静态变量是不能定义在方法体中的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题