c - 解释 C 中这个 "static variable"的行为

标签 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.
    }
}

这是输出:

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 $

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

最佳答案

之后

var++;

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

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

因此,当下次调用 function() 时,上一次调用时所做的增量仍然有效,除了第一次调用之外,不会执行初始化。

关于c - 解释 C 中这个 "static variable"的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14296626/

相关文章:

bash -x 引入奇怪的引号

Android:通过静态变量传递值会导致安全问题吗?

无法跳出循环

java - 不是调试对象或未监听要附加的调试器

c - 如何从解密和加密的数据中找到 RC4 key ?

delphi - Delphi调试器?

python - 通过类名设置类变量时,Python 中隐式调用了哪个函数?

c++ - 如何用另一个静态变量初始化一个静态变量?

c - 带 IF 语句的 For 循环 C 编程

c - SSL_get_verify_result 为 irc.freenode.net 返回错误 20