静态变量具有即使在超出范围后仍保留其值的属性!因此,静态变量将其先前值保留在其先前范围中,并且不会在新范围中再次初始化。
句法:
static data_type var_name = var_value;
以下是有关C中静态变量的一些有趣事实。
1)程序运行时,静态int变量保留在内存中。当声明了该变量的函数调用结束时,普通或自动变量将被销毁。
例如,我们可以使用static int来计数一个函数被调用的次数,但是不能将auto变量用于此目的。
例如下面的程序打印“ 1 2”
#include
int fun()
{
static int count = 0;
count++;
return count;
}
int main()
{
printf("%d ", fun());
printf("%d ", fun());
return 0;
}
输出:
1 2
但是下面的程序打印1 1
#include
int fun()
{
int count = 0;
count++;
return count;
}
int main()
{
printf("%d ", fun());
printf("%d ", fun());
return 0;
}
输出:
1 1
2)静态变量是在数据段而不是堆栈段中分配的内存。有关详细信息,请参见C程序的内存布局。
3)如果未显式初始化静态变量(如全局变量),则初始化为0。例如,在下面的程序中,x的值打印为0,而y的值则是垃圾。有关更多详细信息,请参见此内容。
#include
int main()
{
static int x;
int y;
printf("%d \n %d", x, y);
}
输出:
0
[some_garbage_value]
4)在C语言中,只能使用常量字面量来初始化静态变量。例如,以下程序编译失败。有关更多详细信息,请参见此内容。
#include
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++中,静态全局变量和函数也是可能的。这些目的是将变量或函数的范围限制为文件。有关更多详细信息,请参见C中的静态函数。
6)静态变量不应在结构内部声明。原因是C编译器要求将整个结构元素放在一起(即,结构成员的内存分配应该是连续的)。可以在函数内部声明结构(堆栈段)或动态分配内存(堆段),甚至可以是全局的(BSS或数据段)。无论哪种情况,所有结构成员都应驻留在同一内存段中,因为结构元素的值是通过计算元素相对于结构起始地址的偏移量来获取的。单独将一个成员分离到数据段中会破坏静态变量的目的,并且可能使整个结构具有静态性。
相关文章:
- C++中的静态关键字
- 静态关键字测验
- C++中的静态数据成员
- 静态物体什么时候被破坏?
- 有关静态成员函数的有趣事实
- 静态函数可以是虚拟的吗?
- C++和Java中static关键字的比较
- C中的静态函数