Tipos de variables según existencia y ámbito

Descripción

Las variables en C pueden existir en tres zonas de memoria: memoria global, pila y memoria dinámica. Las variables en cada una de estas zonas tienen un tiempo de vida especifico. El ámbito de visibilidad de las variables en memoria global se puede controlar con el modificador static.
El siguiente cuadro ilustra los tipos de variables en C, según el tiempo de existencia y ámbito de acceso a éstas.

Existencia Tipo Ámbito Definición y declaración
La misma que el programa

(Memoria global)

Global al programa Accesible desde cualquier función en el fichero que se define u otro en el que se declare. Son todas aquellas variables definidas fuera de cualquier función sin ningún modificador de ámbito. Para declarar la variable se hace de la misma forma como se define, pero precedida de la palabra clave extern.
Estática de fichero Accesible desde las funciones definidas en su mismo fichero. Son todas aquellas variables definidas fuera de cualquier función y precedidas de la palabra clave static. En cuanto al ámbito también es aplicable a funciones definidas como static.
Estática de una función Accesible solamente desde la función dentro de la que se define, sólo existe una copia para todos los ámbitos de las posibles llamadas recursivas. Son todas aquellas variables definidas dentro de una función y precedidas de la palabra clave static.
Mientras la ejecución esté dentro del bloque donde se creó.

(Pila)

Local a una función Puede acceder a ellas sólo la función donde se definió. Si se producen llamadas recursivas cada función tendrá su propia variable. Son todas aquellas variables definidas dentro de una función sin modificador o precedidas de la palabras clave register o auto, (auto es la opción por defecto, por lo que normalmente no se utiliza). La palabra clave register indica al compilador que intente almacenar la variable en un registro de la CPU y no en la pila.
Mientras no se destruyan.

(Memoria dinámica)

Variables en memoria dinámica Puede usarlas todo aquel que posea un puntero a ellas. Se crean con la función malloc y se destruyen con free.

La forma de ocultar la información en el fichero fuente se realiza por medio del modificador static. Las variables y funciones con el modificador static no son visibles desde otro módulo. Incluso las variables definidas con static dentro de las funciones tienen una existencia igual a las globales, pero sólo visibles desde la función. Las variables no visibles pueden ser accesibles si se obtiene un puntero a ellas. Los ficheros cabecera, típicamente, contienen las declaraciones de variables por medio de la palabra reservada extern, el prototipado de las funciones accesibles del módulo, la definición de tipos y macros.

Ejemplo

int global;            /*Global al programa */
static int local;      /*Estática de fichero */
void f()
{
   int i;                       /*Local a la función */
   register short int z1, z2;   /*Local a la función */
   auto double x;               /*Local a la función (auto es opcional)*/
   static int numL;             /*Estática de función */
   extern long externa;         /*Externa */
   int *vector;                 /*Puntero a un entero o más*/
   vector=(int*)malloc(sizeof(int)); /*Crea variable en memoria dinámica */
   ...
   free(vector);                /*Destruye variable en memoria dinámica */
}