存储类

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

AUTO(默认)StaticExternRegister是C中变量的4个修饰符。


  • AUTO:默认。 正常变量。

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

    这意味着,在运行时,操作系统不会在函数(包含变量退出)后从内存中删除变量,并在每次调用函数时初始化变量。

    而是仅在第一次函数(包含它被调用)时初始化静态变量。 然后它继续驻留在内存中,直到程序终止。 换句话说, 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