存储类

use*_*516 5 c memory

声明为auto和的变量之间有什么区别static?内存分配autostatic变量有什么区别?为什么我们使用static指针数组及其意义是什么?

The*_*ist 6

AUTO(默认),Static,ExternRegister是C中变量的4个修饰符.


  • 自动:默认.正常变量.

  • STATIC:更改变量的生命周期.(保留范围,没有变化).

    这意味着,在运行期间,操作系统不NOT从存储器一次函数(包含变量退出)删除该变量和每一个函数被调用时初始化变量.

    而是仅在第一次函数(包含它被调用)时初始化静态变量.然后它继续驻留在内存中,直到程序终止.换句话说,STATIC有效地在内存中生成一个变量GLOBAL,但只有LOCAL访问权限.

    存储静态的位置取决于它们是否初始化为0.

    • 0初始化的静态数据进入.BSS(由符号开始的块),

    • 非0初始化数据进入.DATA

    必须注意的是,尽管静态变量总是在内存中,但它们只能从本地范围(它们定义的函数)中访问.

  • EXTERN:用于向编译器发出信号,表示extern-definition只是一个占位符,实际定义在其他地方.将变量声明为extern将导致程序不为其声明的作用域中的变量保留任何内存.找到声明为extern的函数原型也很常见.

  • REGISTER:向编译器发出信号,优先使用CPU寄存器(而不是RAM)来存储该变量.用于在重复访问变量时提高性能(例如:循环计数器变量).


Mic*_*zek 2

我假设如果您谈论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)