Da trilha de C Este conceito ainda não saiu como card do dia. ir para o card de hoje

C Fundamentos Intermediário

Escopo e classes de armazenamento

Em C, o escopo determina onde uma variável pode ser acessada, enquanto a classe de armazenamento define seu tempo de vida (quando ela é criada e destruída) e sua visibilidade. As principais palavras-chave são auto, static, extern e register.

Variáveis locais comuns têm escopo de bloco e tempo de vida automático: nascem ao entrar no bloco e morrem ao sair. Já variáveis static locais mantêm o valor entre chamadas de função, pois são alocadas na memória estática. Variáveis globais têm escopo de arquivo e tempo de vida estático, e podem ser acessadas por outros arquivos com extern.

A palavra-chave register sugere ao compilador que a variável seja armazenada em registrador da CPU, mas isso é apenas uma dica — o compilador pode ignorá-la. Entender essas classes evita bugs como usar variável não inicializada, perder valor entre chamadas ou ter conflitos de nomes.

Pontos-chave

  • auto é o padrão para variáveis locais: escopo de bloco e tempo de vida automático.
  • static local preserva o valor entre chamadas, mas só é visível dentro do bloco.
  • static global restringe a visibilidade ao arquivo atual (linkagem interna).
  • extern declara uma variável definida em outro arquivo ou mais adiante no mesmo arquivo.
  • register sugere armazenamento em registrador; não é possível obter seu endereço com &.
escopo.c
#include <stdio.h>

int contador_global = 0; // variável global, tempo de vida estático

void incrementa(void) {
    static int chamadas = 0; // static local: mantém valor entre chamadas
    chamadas++;
    contador_global++;
    printf("Chamadas: %d, global: %d\n", chamadas, contador_global);
}

int main(void) {
    auto int local = 10; // auto é opcional, mas explícito aqui
    register int rapido = 5; // sugere registrador

    printf("local: %d, rapido: %d\n", local, rapido);
    incrementa();
    incrementa();
    incrementa();

    {
        int local = 99; // novo escopo, sombreia o anterior
        printf("local interno: %d\n", local);
    }
    printf("local externo: %d\n", local);
    return 0;
}

Exercícios

  1. 1
    Fácil

    Contador com static local

    Crie uma função int proximo(void) que retorne números sequenciais (1, 2, 3, ...) a cada chamada, usando uma variável static local. No main, chame a função 5 vezes e imprima os valores.

    Resolver
  2. 2
    Médio

    Escopo de bloco e sombreamento

    Escreva um programa que declare uma variável int x = 1; no main. Em seguida, crie um bloco { ... } que declare outra variável int x = 2; e imprima seu valor. Depois do bloco, imprima o valor de x novamente. Explique o que acontece com o escopo.

    Resolver
  3. 3
    Desafio

    Módulo com static e extern

    Crie dois arquivos: contador.c e main.c. No contador.c, defina uma variável global int total e uma função void incrementa(void) que a incrementa. Use static para uma variável auxiliar interna e extern no main.c para acessar total. O main deve chamar incrementa três vezes e imprimir o valor de total após cada chamada.

    Resolver

Continue estudando