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

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

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

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

这意味着以下程序无效:

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

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

 error: initializer element is not constant 

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