En el lenguaje C, el significado literal de static fácilmente nos puede llevar por mal camino; en realidad tiene tres funciones.

(1) Primero presentaré su primera y más importante función: ocultar.

Cuando compilamos múltiples archivos a la vez, todas las variables globales y funciones sin el prefijo static tienen visibilidad global. Para entender esta afirmación, daré un ejemplo. Vamos a compilar dos archivos fuente a la vez: uno es a.c y el otro es main.c.

A continuación se muestra el contenido de a.c:

Código del archivo a.c

char a = 'A'; // global variable
void msg()
{
    printf("Hello\n");
}

A continuación se muestra el contenido de main.c:

Código del archivo main.c

int main(void)
{    
    extern char a;    // extern variable must be declared before use
    printf("%c ", a);
    (void)msg();
    return 0;
}

El resultado de ejecución del programa es:

A Hello

Podrías preguntarte: ¿por qué la variable global a y la función msg definidas en a.c pueden usarse en main.c? Como se dijo antes, todas las variables globales y funciones sin el prefijo static tienen visibilidad global y pueden ser accedidas por otros archivos fuente. En este ejemplo, a es una variable global y msg es una función, y ninguna tiene el prefijo static, por lo tanto son visibles para el otro archivo fuente main.c.

Si se añade static, se ocultarán a otros archivos fuente. Por ejemplo, si se añade static antes de las definiciones de a y msg, main.c no podrá verlas. Con esta característica se pueden definir funciones y variables con el mismo nombre en diferentes archivos sin preocuparse por conflictos de nombres. static puede usarse como prefijo para funciones y variables. Para las funciones, el efecto de static se limita a ocultar; para las variables, static tiene además los siguientes dos efectos.

(2) El segundo propósito de static es mantener la persistencia del contenido de la variable.

Las variables almacenadas en el área de datos estáticos se inicializan cuando el programa comienza a ejecutarse, y esta es la única inicialización. Hay dos tipos de variables almacenadas en el área de almacenamiento estático: variables globales y variables static. Sin embargo, en comparación con las variables globales, static puede controlar el alcance de visibilidad de la variable; en definitiva, static se usa para ocultar. Aunque este uso no es común, daré un ejemplo.

Ejemplo

#include <stdio.h>

int fun(void){
    static int count = 10;    // De hecho, esta sentencia de asignación nunca se ha ejecutado
    return count--;
}

int count = 1;

int main(void)
{    
    printf("global\t\tlocal static\n");
    for(; count <= 10; ++count)
        printf("%d\t\t%d\n", count, fun());    
   
    return 0;
}

El resultado de ejecución del programa es:

global          local static

1               10

2               9

3               8

4               7

5               6

6               5

7               4

8               3

9               2

10              1

(3) El tercer propósito de static es inicializar por defecto a 0.

En realidad, las variables globales también tienen esta propiedad, porque las variables globales también se almacenan en el área de datos estáticos. En el área de datos estáticos, todos los bytes en memoria tienen un valor predeterminado de0x00, en algunas ocasiones esta característica puede reducir la carga de trabajo del programador. Por ejemplo, al inicializar una matriz dispersa, podemos establecer uno por uno todos los elementos en0, y luego a los pocos elementos que no son0se les asigna un valor. Si se define como estático, se ahorra la operación inicial de poner0de la operación. Otro ejemplo: si quieres usar una matriz de caracteres como cadena, pero cada vez añadir al final de la matriz de caracteres\0es demasiado problemático. Si defines la cadena como estática, te ahorras esa molestia, porque allí ya es de por sí\0 。

Podrías hacer un pequeño experimento para verificarlo.

Ejemplo

#include <stdio.h>

int a;

int main(void)
{
    int i;
    static char str[10];

    printf("integer: %d;  string: (begin)%s(end)", a, str);

    return 0;
}

El resultado de ejecución del programa es el siguiente:

integer: 0; string: (begin)(end)

Finalmente, un resumen en una frase de las tres funciones de static. Primero, la función principal de static es ocultar; segundo, como las variables static se almacenan en el área de almacenamiento estático, tienen persistencia y un valor predeterminado de 0.

Fuente del artículo: https://www.cnblogs.com/dc10101/archive/2007/08/22/865556.html