AUTO(默认),Static,Extern和Register是C中变量的4个修饰符.
自动:默认.正常变量.
STATIC:更改变量的生命周期.(保留范围,没有变化).
这意味着,在运行期间,操作系统不NOT从存储器一次函数(包含变量退出)删除该变量和每一个函数被调用时初始化变量.
而是仅在第一次函数(包含它被调用)时初始化静态变量.然后它继续驻留在内存中,直到程序终止.换句话说,STATIC有效地在内存中生成一个变量GLOBAL,但只有LOCAL访问权限.
存储静态的位置取决于它们是否初始化为0.
0初始化的静态数据进入.BSS(由符号开始的块),
非0初始化数据进入.DATA
必须注意的是,尽管静态变量总是在内存中,但它们只能从本地范围(它们定义的函数)中访问.
EXTERN:用于向编译器发出信号,表示extern-definition只是一个占位符,实际定义在其他地方.将变量声明为extern将导致程序不为其声明的作用域中的变量保留任何内存.找到声明为extern的函数原型也很常见.
REGISTER:向编译器发出信号,优先使用CPU寄存器(而不是RAM)来存储该变量.用于在重复访问变量时提高性能(例如:循环计数器变量).
我假设如果您谈论auto变量,您可能指的是函数中的局部变量。auto是默认值,这意味着变量在调用函数时在堆栈上分配,并在函数返回时释放。static意味着变量在第一次调用函数时分配,并在程序的其余部分保持分配状态。这意味着:
int foo() {
static int x = 0;
return x++;
}
printf("%d\n", foo()); // Outputs 0
printf("%d\n", foo()); // Outputs 1
printf("%d\n", foo()); // Outputs 2
Run Code Online (Sandbox Code Playgroud)