1、概述
static声明的变量在C语言中有两方面的特征:
1)、变量会被放在措施的全局存储区中,这样可以在下一次挪用的时候还可以保持本来的赋值。这一点是它与仓库变量和堆变量的区别。
2)、变量用static奉告编译器,本身仅仅在变量的浸染范畴内可见。这一点是它与全局变量的区别。
2、问题:Static的领略
关于static变量,请选择下面所有说法正确的内容:
A、若全局变量仅在单个C文件中会见,则可以将这个变量修改为静态全局变量,以低落模块间的耦合度;
B、若全局变量仅由单个函数会见,则可以将这个变量改为该函数的静态局部变量,以低落模块间的耦合度;
C、设计和利用会见动态全局变量、静态全局变量、静态局部变量的函数时,需要思量重入问题;
D、静态全局变量过大,可那会导致仓库溢出。
谜底与阐明:
对付A,B:按照本篇概述部门的说明b),我们知道,A,B都是正确的。
对付C:按照本篇概述部门的说明a),我们知道,C是正确的(所谓的函数重入问题,下面会具体叙述)。
对付D:静态变量放在措施的全局数据区,而不是在仓库中分派,所以不行能导致仓库溢出,D是错误的。
因此,谜底是A、B、C。
3、问题:不行重入函数
曾经设计过如下一个函数,在代码检视的时候被提醒有bug,因为这个函数是不行重入的,为什么?
unsigned int sum_int( unsigned int base )
{
unsigned int index;
static unsigned int sum = 0; // 留意,是static范例的。
for (index = 1; index <= base; index++)
{
sum += index;
}
return sum;
}
谜底与阐明:
所谓的函数是可重入的(也可以说是可预测的),即:只要输入数据沟通就应发生沟通的输出。
这个函数之所以是不行预测的,就是因为函数中利用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”成果的的函数。因此假如我们需要一个可重入的函数,那么,我们必然要制止函数中利用static变量,这种函数中的static变量,利用原则是,能不消只管不消。
将上面的函数修改为可重入的函数很简朴,只要将声明sum变量中的static要害字去掉,变量sum即变为一个auto 范例的变量,函数即变为一个可重入的函数。
虽然,有些时候,在函数中是必需要利用static变量的,好比当某函数的返回值为指针范例时,则必需是static的局部变量的地点作为返回值,若为auto范例,则返回为错指针。