最近在一次面试中,我遇到了这个问题:“静态变量如何在函数调用中保持其先前的值”。想了一会儿,但真的想不出任何令人信服的答案。任何人都可以解释一下吗?试图做Google,找不到我的信息。静态如何通过函数调用维护其价值
回答
正在执行的程序的整个生命周期中都存在一个静态变量。当执行线程离开声明它的函数时,它不会停止存在。所以,它永远不会失去它的价值。
静态变量(在函数内部还是不在函数内)位于全局内存空间中。它们在程序开始时被初始化并驻留程序的长度。
C11 5.1.2“具有静态存储中的所有对象应程序启动之前对其进行初始化(设置为它们 初始值)。”
6.2.4.3“...它的生命周期是程序的整个执行过程,它的存储值在程序启动之前只初始化一次。”
的功能想想作用域为全局变量只对函数的范围可见他们。
静态变量存储在所有的全局变量存储的。数据区正在定义静态变量。这些全局和静态变量作为exec操作的一部分进行分配(即创建一个新进程/分配一个新进程)。
-----------------------
| Command Line Arg |
|---------------------|
| Stack |
| \/ | < Grow downward
|---------------------|
| /\ |
| Heap | < Grows Upward
|---------------------|
| .bss | (Uninitialized global variables)
|---------------------|
| .data | (initialized global/static variables)
|---------------------|
| .text |
-----------------------
在上面的图。数据是区域,所有这些声明的函数内部或声明为全局变量存储在静态变量。 希望这有助于。
引用ISO C标准,6.2.4节第2段:
的寿命的对象的是哪个存储是保证将保留在程序执行期间 的部分为了它。存在一个对象, 具有一个固定的地址,并在整个 的生存期中保留其最后存储的值。
第3段:
其标识符被声明[SNIP]与存储类 符静态,具有静态存储持续时间的对象。它的使用期限是程序的整个执行过程,其存储值在程序启动之前仅初始化为 一次。
这也解释了为什么它是需要保持其以前的值,但不如何它这样做(这不是标准的工作,告诉实现如何做的事情,他们必须怎么做)。
如何它这样做?实现选择以任何方式使其实现。你可以轻易地问为什么它不会保持以前的价值。
但基本上它存储在你的main
函数启动之前分配的内存的某个区域中,只要程序正在运行,并且只有程序本身不会修改其内容,才会释放内存区域。
在这方面,在文件范围中定义的对象与在关键字static
之间的函数内定义的对象之间没有区别;两个对象都具有静态存储持续时间,并且可能被存储在相同的内存区域中。
简而言之,函数内部的静态变量与全局变量相似。编译器对可见性和对变量的访问进行所有必要的检查。除此之外,这只是另一个全球变种。
因此,它是合法的做到这一点:
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;
}
我不建议我们应该实践这虽然! ;)
- 1. 我如何说服GroovyShell通过eval()调用维护状态?
- 2. 如何通过ajax调用void非静态函数?
- 3. 如何通过dll从静态库调用函数。
- 4. 为什么这个非静态变量通过函数调用保持其值?
- 5. 如何从另一个静态函数调用静态函数
- 6. 通过函数指针静态调用虚函数
- 7. 如何保护静态函数/变量
- 8. 如何在调用之间维护JavaScript函数变量状态(值)?
- 9. ASP.NET维护静态变量
- 10. 如何从静态成员函数中调用非静态成员函数而不通过类实例
- 11. ExtJS的5 - 静态函数调用其他静态函数从同一类
- 12. 通过方法名称调用静态函数?
- 13. 可能通过调用函数初始化静态变量
- 14. 如何通过成功者来维护PHP对象AJAX调用
- 15. 如何通过异步瀑布调用维护请求会话?
- 16. 如何通过windowsphone维护通用数据?
- 17. 如何从静态成员函数中调用非静态成员函数?
- 18. 如何调用静态函数,如成员函数
- 19. 从静态函数调用非静态函数
- 20. 静态函数调用非静态函数在C++
- 21. 通过静态变量的函数
- 22. 通过静态函数的类迭代
- 23. 数据表通过解析其价值
- 24. 如何使用非静态函数内部静态函数
- 25. 通过调用另一个函数设置的函数中的静态变量
- 26. 可以通过C中的函数指针调用静态函数吗?
- 27. QThread:如何使用受保护的静态函数
- 28. 调用静态函数内部的基类过载函数?
- 29. C++模板函数跳过一个静态函数调用
- 30. 如何在PHP类中维护静态成员状态?
全局变量如何保持其值? –