解释C中这个"静态变量"的行为

Soa*_*ask -4 c debugging static-variables

我正在阅读"黑客攻击,剥削艺术"一书,这个代码示例让我很困惑.

它位于全局变量范围的上下文中:

#include <stdio.h>

void function() { // An example function, with its own context
    int var = 5;
    static int static_var = 5; // Static variable initialization
    printf("\t[in function] var = %d\n", var);
    printf("\t[in function] static_var = %d\n", static_var);
    var++; // Add one to var.
    static_var++; // Add one to static_var.
}

int main() { // The main function, with its own context
    int i;
    static int static_var = 1337; // Another static, in a different context
    for(i=0; i < 5; i++) { // Loop 5 times.
        printf("[in main] static_var = %d\n", static_var);
        function(); // Call the function.
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

reader@hacking:~/booksrc $ gcc static.c
reader@hacking:~/booksrc $ ./a.out
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 5
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 6
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 7
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 8
[in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 9
reader@hacking:~/booksrc $
Run Code Online (Sandbox Code Playgroud)

问题是,为什么[in function] var = 5保持稳定?我们定义var++;以及static_var++;在本地函数内.怎么了?

Dan*_*her 5

之后

var++;
Run Code Online (Sandbox Code Playgroud)

function(),该局部变量不再使用.它超出范围,并在函数返回时不再存在.当function()被调用的下一时间,一个新的var分配和初始化为5.

两者static_var具有静态存储持续时间,它们存在于程序的整个生命周期中.对这些的任何修改都会持续存在,并且只会初始化一次.

因此,当function()下次调用时,在前一次调用中完成的增量仍然有效,除非在第一次调用时执行初始化.