我正在阅读“黑客攻击,剥削艺术”一书,这段代码示例让我很困惑。
它在全局变量范围的上下文中:
#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++;
。怎么了?
答案 0 :(得分:5)
之后
var++;
<{1>}中的,不再使用该局部变量。它超出范围,并在函数返回时不再存在。下次调用function()
时,会分配一个新function()
并初始化为var
。
两个5
具有静态存储持续时间,它们在程序的整个生命周期中都存在。对这些的任何修改都会持续存在,并且只会初始化一次。
因此,下次调用static_var
时,前一次调用中的增量仍然有效,除非在第一次调用时才执行初始化。
答案 1 :(得分:3)
因为var
不是静态的。每次调用函数时,它都是一个不同的实例。
答案 2 :(得分:2)
这正是静态变量与非静态变量的区别。静态变量具有静态存储持续时间,这意味着变量在程序运行期间保持活动状态。非静态变量具有自动存储持续时间;意味着它将在创建它的范围的末尾消失(在这种情况下,在function
的末尾)。当处理变量时,下次调用该函数时,将创建该变量的新实例。