-4

我正在阅读“hacking, The Art of Exploitation”一书,这个代码示例真的让我很困惑。

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

#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++;在局部函数内。怎么了?

4

3 回答 3

5

之后

var++;

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

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

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

于 2013-01-12T18:36:40.763 回答
3

因为var不是静态的。每次调用该函数时,它都是一个不同的实例。

于 2013-01-12T18:36:16.583 回答
2

这正是静态变量与非静态变量的区别所在。静态变量具有静态存储持续时间,这意味着该变量在程序运行期间保持活动状态。非静态变量具有自动存储期限;这意味着它将在创建它的范围的末尾消失(在这种情况下,在 的末尾function)。释放变量后,下次调用该函数时,将创建该变量的新实例。

于 2013-01-12T18:38:32.320 回答