HOWTO · C

Variable estática en C

Este artículo presenta cómo utilizar una variable estática en C

En esta página

Este artículo demostrará múltiples métodos sobre cómo usar variables estáticas en C.

Usar la variable static para preservar el valor entre llamadas a funciones en C

La palabra clave static se utiliza en múltiples contextos, uno de ellos es para declarar la variable que mantiene su valor en la memoria entre las llamadas de función. Este tipo de variable tiene una duración de almacenamiento estática.

En el siguiente ejemplo, declaramos una variable k en el ámbito de un bloque de funciones. Cuando el flujo de control sale de la función up, el valor de k persiste en memoria hasta que el programa sale. Este comportamiento puede ser utilizado para almacenar objetos de datos de forma persistente durante la ejecución del programa.

Nótese que las variables estáticas se inicializan automáticamente a 0 si no las inicializamos explícitamente.

#include <stdio.h>
#include <stdlib.h>

static int j = 0;

void up(void) {
  static int k = 0;
  j++;
  k++;
  printf("  up() called. k=%2d, j=%2d\n", k, j);
}

int main() {
  int i;

  for (i = 0; i < 3; i++) up();

  exit(EXIT_SUCCESS);
}

Producción :

up() called. k= 1, j= 1
up() called. k= 2, j= 2
up() called. k= 3, j= 3

Usar la palabra clave static para declarar una variable dentro del ámbito del archivo en C

Las variables cualificadas static pueden ser declaradas fuera de cualquier función, haciéndolas visibles dentro del ámbito del fichero fuente único. Tales variables se denominan variables estáticas con enlace interno, lo que significa que sus valores sólo pueden ser utilizados por la función en el mismo archivo.

Observe que ambas funciones tienen la variable local llamada k inicializada a cero, pero cuando se llama a la función down, la variable k (declarada en up) no está en el mismo ámbito, y se inicializa una nueva en la ubicación de memoria diferente. Así, el valor negativo se muestra después de dos iteraciones. Tenga en cuenta que los parámetros de la función no pueden tener el calificador static.

#include <stdio.h>
#include <stdlib.h>

static int j = 0;

void up(void) {
  static int k = 0;
  j++;
  k++;
  printf("  up() called. k=%2d, j=%2d\n", k, j);
}

void down(void) {
  static int k = 0;
  j--;
  k--;
  printf("down() called. k=%2d, j=%2d\n", k, j);
}

int main() {
  int i;

  for (i = 0; i < 3; i++) up();
  for (i = 0; i < 2; i++) down();

  exit(EXIT_SUCCESS);
}

Producción :

up() called. k= 1, j= 1
up() called. k= 2, j= 2
up() called. k= 3, j= 3
down() called. k=-1, j= 2
down() called. k=-2, j= 1