static存储类有不同的目的,根据不同的文件中声明的位置:
仅将标识符限制在该翻译单元内(scope = file)。
static int i; /*相同;static附加到函数类型f,而不是返回类型int*/ static int f(int n);
要保存数据以供下次调用函数使用(scope = block):
void foo() { static int a = 0; /*具有静态存储持续时间,其生存期为整个程序的执行;在上初始化为0 ,第一个函数调用 */ int b = 0; /* b具有块作用域,并且具有自动存储持续时间,并且只在函数中“存在” */ a += 10; b += 10; printf("static int a = %d, int b = %d\n", a, b); } int main(void) { int i; for (i = 0; i < 5; i++) { foo(); } return 0; }
此代码打印:
static int a = 10, int b = 10 static int a = 20, int b = 10 static int a = 30, int b = 10 static int a = 40, int b = 10 static int a = 50, int b = 10
静态变量即使在多个不同线程中调用时也保留其值。
在函数参数中使用以表示期望数组具有最小数量的常量和一个非null参数:
/* a is expected to have at least 512 elements. */ void printInts(int a[static 512]) { size_t i; for (i = 0; i < 512; ++i) printf("%d\n", a[i]); }
所需数量的项(甚至是非null指针)不必由编译器检查,并且如果您没有足够的元素,则不需要编译器以任何方式通知您。如果程序员传递的少于512个元素或空指针,则将导致未定义的行为。由于不可能强制执行此操作,因此在将该参数的值传递给此类函数时必须格外小心。