假设我在C中的函数内声明了一个静态变量。
如果我多次调用该函数,每次调用函数时是否会在内存中重新分配静态变量?
如果确实重新分配,为什么始终保持最后一个值?
示例:
void add()
{
static int x = 1;
x++;
printf("%d\n",x);
}
int main()
{
add(); // return 2
add(); // return 3
add(); // return 4
}
答案 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
但是,当程序运行时,您可以将静态变量的值更改为任何其他值。