静态变量具有保留其值的属性,即使它们超出了它们的范围!因此,静态变量在其先前的作用域中保留其先前的值,并且不会在新的作用域中再次初始化。
语法:
static data_type var_name = var_value;
以下是关于 C 中的静态变量的一些有趣事实。
1) 静态 int 变量在程序运行时保留在内存中。当声明变量的函数调用结束时,普通或自动变量将被销毁。
例如,我们可以使用 static int 来计算函数被调用的次数,但不能为此使用自动变量。
例如下面的程序打印“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 或数据段)。不管是什么情况,所有结构成员都应该驻留在同一个内存段中,因为结构元素的值是通过计算元素从结构起始地址开始的偏移量来获取的。将一个成员单独分离到数据段会破坏静态变量的目的,并且可以将整个结构设为静态。