C语言static

示例

static存储类有不同的目的,根据不同的文件中声明的位置:

  1. 仅将标识符限制在该翻译单元内(scope = file)。

    static int i;
    /*相同;static附加到函数类型f,而不是返回类型int*/
    static int f(int n);
  2. 要保存数据以供下次调用函数使用(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

静态变量即使在多个不同线程中调用时也保留其值。

C99
  1. 在函数参数中使用以表示期望数组具有最小数量的常量和一个非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个元素或空指针,则将导致未定义的行为。由于不可能强制执行此操作,因此在将该参数的值传递给此类函数时必须格外小心。