#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;}
我想的是,函数func_a
在调用完一次之后,栈空间就被释放掉了。虽然静态变量a
仍然被保存在了某块内存中,但是,原来的栈空间保存的信息已经没了。那么问题就来了,第二次调用它是怎么知道这个变量a
所在的位置?而且它是怎么知道就是上次调用的那个变量a
?
解决方案
虽然栈空间没了,但是函数的代码还在呀。a
的地址是在代码段里写明的,它不是栈空间里的变量。
函数是怎么知道
a
的位置?是编译器告诉它的。编译器把static a
放在数据段以后记下地址,函数里面用到a
的地方都编译成引用那个地址就好了。函数是怎么知道就是上次调用的那个变量?它知不知道没有关系。只要用那个数据段里面的地址的内容就好了。