静态变量有一个属性,即使在超出其作用域后也能保持其值!因此,静态变量在其先前的作用域中保留其先前的值,并且不会在新的作用域中再次初始化。
语法:
static data_type var_name = var_value;
以下是有关C中静态变量的一些有趣事实。
1. 程序运行时,静态int变量仍保留在内存中。当声明了该变量的函数调用结束时,普通或auto变量将被销毁。
例如,我们可以使用static int来计算函数被调用的次数,但是auto变量不能用于此目的。
例如下面的程序打印“1 2”
#include<stdio.h>
int fun()
{
static int count = 0;
count++;
return count;
}
int main()
{
printf("%d ", fun());
printf("%d ", fun());
return 0;
}
输出:
1 2
但是下面的程序打印1 1
#include<stdio.h>
int fun()
{
int count = 0;
count++;
return count;
}
int main()
{
printf("%d ", fun());
printf("%d ", fun());
return 0;
}
输出:
1 1
2. 静态变量是在数据段而不是堆栈段中分配的内存。
3. 如果没有显式初始化,静态变量(如全局变量)将初始化为0。例如,在下面的程序中,x的值被打印为0,而y的值是不确定的值。
#include <stdio.h>
int main()
{
static int x;
int y;
printf("%d \n %d", x, y);
}
输出:
0
[some_garbage_value]
4. 在C语言中,静态变量只能使用常量文本进行初始化。例如,下面的程序编译失败。
#include<stdio.h>
int initializer(void)
{
return 50;
}
int main()
{
static int i = initializer();
printf(" value of i = %d", i);
getchar();
return 0;
}
输出:
In function 'main':
9:5: error: initializer element is not constant
static int i = initializer();
^
请注意,此条件在C++中不成立。因此,如果你把程序保存为C++程序,它将编译并运行良好。
5. 静态全局变量和函数在C/C++中也是可能出现的。其目的是将变量或函数的作用域限制为文件。
6. 静态变量不应在结构内部声明。原因是C编译器要求将整个结构元素放在一起(即结构成员的内存分配应该是连续的)。可以在函数中声明结构(堆栈段)或动态分配内存(堆段),甚至可以是全局的(BSS或数据段)。无论哪种情况,所有结构成员都应驻留在同一内存段中,因为结构元素的值是通过计算元素相对于结构起始地址的偏移量来获取的。将一个成员单独分离到数据段中会破坏静态变量的目的,并且有可能使整个结构成为静态的。
参考文档
[1]GeeksforGeeks.Static Variables in C[EB/OL].https://www.geeksforgeeks.org/static-variables-in-c/,2019-08-06.