【问题标题】:Are static variables in C re-allocated every time the parent function is called?每次调用父函数时,是否都会重新分配 C 中的静态变量?
【发布时间】:2009-11-09 21:31:22
【问题描述】:

假设我在 C 函数中声明了一个静态变量。

如果我多次调用该函数,是否每次调用该函数时都会在内存中重新分配静态变量?

如果它确实被重新分配,为什么总是保持最后一个值?

例子:

void add()
{
    static int x = 1;
    x++;
    printf("%d\n",x);
}

int main()
{
    add(); // return 2
    add(); // return 3
    add(); // return 4
}

【问题讨论】:

  • 请使用正确的代码格式重新格式化代码 - 每行前使用四个空格。
  • 您可以在示例代码中使用代码格式吗?

标签: c static variables


【解决方案1】:

否 - 静态变量基本上是存在于本地命名空间中的全局变量。

【讨论】:

    【解决方案2】:

    不,变量不会每次都重新分配。 这就像有一个全局变量,但它只有局部范围;即,您只能从该函数内部引用它。

    【讨论】:

      【解决方案3】:

      不,

      它应该如何在函数调用之间保持它的价值?

      静态变量在这方面类似于全局变量,但是它们是周围范围(函数、类、命名空间)的局部变量。

      【讨论】:

        【解决方案4】:

        每次调用函数时都不会重新分配静态变量。 它们充当正常的局部变量。 但是它们的存储时间不同,即当一个函数为静态变量分配一些值时,该值在函数调用之间保留。

        【讨论】:

          【解决方案5】:

          在 C 编程语言中,静态与全局变量和函数一起使用,以将其范围设置为包含文件。在局部变量中,static 用于将变量存储在静态分配的内存中,而不是自动分配的内存中。虽然语言没有规定这两种内存的实现方式,但静态分配的内存通常在编译时保留在程序的数据段中,而自动分配的内存通常作为临时调用堆栈实现。

          【讨论】:

            【解决方案6】:

            正如静态前缀所暗示的,该变量位于静态内存中,其中包含在编译时地址已知的变量(对于全局变量来说,这种说法有点迂腐)。这与自动变量(分配在堆栈上)和动态变量(使用 malloc 在堆上分配)不同。

            函数(或其他静态)中的静态变量的初始化是在程序运行之前执行的。更准确地说,它只能是一些常量表达式,编译器可以在编译时得到。

            这意味着以下程序无效:

            int f(int x){
                return x+1;
            }
            
            int main(){
                static int a = f(1);
                return a;
            }
            

            当我使用 gcc 编译它时,它会按预期抱怨以下消息:

            error: initializer element is not constant
            

            但是,当程序运行时,您可以像更改任何其他变量一样更改静态变量的值。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-09-08
              • 1970-01-01
              • 1970-01-01
              • 2021-08-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多