最近在一次采访中,我遇到了这个问题“静态变量如何在函数调用中保持其先前的值”。想了一会但是真的想不出任何有说服力的答案。有人可以解释一下吗?尝试做谷歌,找不到我的信息。
答案 0 :(得分:5)
静态变量存储在.data区域中,其中存储了所有全局变量。并且这些全局和静态变量被分配为exec操作的一部分(即创建新进程/分支新进程)。
-----------------------
| Command Line Arg |
|---------------------|
| Stack |
| \/ | < Grow downward
|---------------------|
| /\ |
| Heap | < Grows Upward
|---------------------|
| .bss | (Uninitialized global variables)
|---------------------|
| .data | (initialized global/static variables)
|---------------------|
| .text |
-----------------------
在上图中.data是存储在函数内声明或声明为全局变量的所有静态变量的区域。 希望这会有所帮助。
答案 1 :(得分:4)
简单来说,函数内部的静态变量类似于全局变量。编译器会对可见性和对变量的访问进行所有必要的检查。除此之外,它只是另一个全球变种。
因此,这样做是合法的:
int *test_static()
{
static int func_var = 1234;
printf("%d", func_var);
return &func_var; // return pointer to int
}
int main()
{
int *i = test_static(); // will print '1234' and point i to func_var
// we can't do "func_var = 99;" here, but...
*i = 99;
test_static(); // will print '99'
return 0;
}
我并不是说我们应该练习这个! ;)
答案 2 :(得分:1)
静态变量(在函数内部或不在函数内)位于全局内存空间中。它们在程序启动时初始化并驻留在程序的长度内。
C11 5.1.2“所有具有静态存储持续时间的对象都应初始化(设置为它们的 程序启动前的初始值。“
6.2.4.3“......它的生命周期是整个程序的执行,它的存储值只在程序启动之前初始化一次。”
答案 3 :(得分:1)
将函数范围的静态变量视为全局变量,仅对它们所定义的函数的范围可见。
答案 4 :(得分:1)
引用ISO C标准,第6.2.4节第2段:
对象的生命周期是程序执行期间的一部分 保证保留哪个存储空间。存在一个对象, 具有恒定的地址,并始终保留其最后存储的值 它的一生。
第3段:
一个对象,其标识符与存储类一起声明为 [SNIP] 说明符静态,具有静态存储持续时间。它的一生就是 程序的整个执行及其存储的值被初始化 程序启动前只有一次。
这就解释了为什么需要来维持以前的值,而不是 它是如何做到的(告诉实现如何做事,这不是标准的工作,只是什么他们必须这样做。)
如何这样做?无论如何,实现都选择这样做。你可以很容易地问为什么它不会维持它以前的价值。
但基本上它存储在你的main
函数启动之前分配的某个内存区域中,并且只要程序正在运行就不会释放,并且除非程序本身这样做,否则不会修改其内容。
在这方面,文件范围定义的对象与使用static
关键字的函数内定义的对象之间没有区别;两个对象都有静态存储持续时间,并且可能存储在相同的内存区域中。
答案 5 :(得分:0)
在执行程序的整个生命周期中都存在一个静态变量。当执行线程离开声明它的函数时,它不会停止存在。所以,它永远不会失去它的价值。
答案 6 :(得分:0)
我给你一个可以帮助你的参考。