每次调用父函数时,是否重新分配C中的静态变量?

时间:2009-11-09 21:31:23

标签: c static variables

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

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

如果确实重新分配,为什么始终保持最后一个值?

示例:

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

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

6 个答案:

答案 0 :(得分:13)

否 - 静态变量基本上是位于本地名称空间内的全局变量。

答案 1 :(得分:3)

不,每次都不会分配变量。 它就像有一个全局变量,但它只有局部范围;也就是说,你只能从该函数内部引用它。

答案 2 :(得分:2)

没有

如何在函数调用之间保留它的值?

静态变量在这方面就像全局变量,但它们是周围范围(函数,类,命名空间)的本地变量。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

由于静态前缀表明变量位于静态内存中,该内存包含在编译时已知地址的变量(对于全局变量来说,这是一种有点迂腐的方式)。这与自动变量(在堆栈上分配)和动态变量(使用malloc在堆上分配)不同。

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

这意味着以下程序无效:

int f(int x){
    return x+1;
}

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

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

error: initializer element is not constant

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