Sobes.tech
Junior

Quando e por quanto tempo existem variáveis globais e locais em C++?

sobes.tech IA

Resposta da IA

Variáveis globais

  • Tempo de existência: Desde o início do programa até à sua finalização.
  • Local de armazenamento: Normalmente na área de memória estática (.data ou secção .bss do ficheiro executável).
  • Inicialização:
    • As variáveis globais não estáticas, definidas ao nível do ficheiro, com construtores não triviais, são inicializadas antes da chamada a main().
    • As variáveis globais com inicialização a zero (por exemplo, int i = 0;) também são inicializadas antes de main().
    • As variáveis definidas com const ou com duração de armazenamento estático são inicializadas ao carregar o programa.
  • Disponibilidade: São visíveis em todas as funções dentro do âmbito.

Variáveis locais

  • Tempo de existência: Desde a definição da variável dentro de um bloco de código (função, ciclo, condicional, etc.) até à saída desse bloco.
  • Local de armazenamento: Normalmente na pilha (para variáveis automáticas). As variáveis locais estáticas são armazenadas na área de memória estática.
  • Inicialização:
    • As variáveis locais automáticas não são inicializadas por defeito (contêm "sujeira"). Requerem inicialização explícita.
    • As variáveis locais estáticas são inicializadas uma vez na sua primeira declaração.
  • Disponibilidade: Apenas são visíveis dentro do bloco de código onde são definidas.

Exemplos

// Variável global
int global_variable = 10;

void some_function() {
    // Variável local (automática)
    int local_variable_1; // Não inicializada

    // Variável local (automática) com inicialização
    int local_variable_2 = 20;

    // Variável local estática
    static int static_local_variable = 30; // Inicializa-se uma vez

    // Acesso à variável global
    global_variable++;

    // Acesso às variáveis locais
    local_variable_1 = global_variable;
    static_local_variable++;

    // Após sair de some_function(), local_variable_1 e local_variable_2 deixam de existir
    // static_local_variable continua a existir, mantendo o seu valor
}

int main() {
    some_function();
    some_function(); // static_local_variable manteve o valor
    // A variável global está disponível aqui
    // local_variable_1 e local_variable_2 não estão acessíveis

    return 0;
}

Tabela de comparação

Característica Variáveis globais Variáveis locais (automáticas) Variáveis locais estáticas
Tempo de existência Desde o início do programa até à sua finalização Desde a definição até à saída do bloco de código Desde a primeira declaração até à finalização do programa
Local de armazenamento Área de memória estática (.data, .bss) Pilha Área de memória estática (.data, .bss)
Inicialização Antes de chamar main() ou ao carregar o programa Não inicializadas por defeito. Requerem inicialização explícita Uma vez na primeira declaração
Disponibilidade Em todo o âmbito do ficheiro Apenas dentro do bloco de código Apenas dentro do bloco de código