Variável estática em C

Jinku Hu 12 outubro 2023
  1. Utilizar a variável estática para preservar o valor entre chamadas de funções em C
  2. Utilizar a palavra-chave static para declarar variável dentro do âmbito do ficheiro em C
Variável estática em C

Este artigo irá demonstrar múltiplos métodos sobre como utilizar variáveis estáticas em C.

Utilizar a variável estática para preservar o valor entre chamadas de funções em C

A palavra-chave static é utilizada em múltiplos contextos, um deles é declarar a variável que mantém o seu valor na memória entre as chamadas de função. Este tipo de variável tem uma duração de armazenamento estático.

No exemplo seguinte, declaramos uma variável k no âmbito de um bloco de funções. Quando o fluxo de controlo deixa a função up, o valor da variável k persiste na memória até que o programa saia. Este comportamento pode ser utilizado para armazenar objectos de dados de forma persistente durante a execução do programa.

Note-se que as variáveis estáticas são automaticamente inicializadas a 0, se não as inicializarmos explicitamente.

#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);
}

Resultado:

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

Utilizar a palavra-chave static para declarar variável dentro do âmbito do ficheiro em C

As variáveis static qualificadas podem ser declaradas fora de qualquer função, tornando-as visíveis dentro do âmbito do ficheiro de fonte única. Tais variáveis são chamadas variáveis estáticas com ligação interna, o que significa que os seus valores só podem ser utilizados pela função no mesmo ficheiro.

Note-se que ambas as funções têm a variável local chamada k inicializada a zero, mas quando a função down é chamada, a variável k (declarada em up) não está no mesmo âmbito, e uma nova é inicializada no local de memória diferente. Assim, o valor negativo é exibido após duas iterações. Note-se que os parâmetros da função não podem ter um qualificador 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);
}

Resultado:

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook