Sobes.tech
Junior

Quando e per quanto tempo esistono le variabili globali e locali in C++?

sobes.tech AI

Risposta dell'AI

Variabili globali

  • Tempo di esistenza: Dall'avvio del programma fino alla sua terminazione.
  • Luogo di memorizzazione: Di solito nell'area di memoria statica (.data o sezione .bss del file eseguibile).
  • Inizializzazione:
    • Le variabili globali non statiche, definite a livello di file, con costruttori non triviali, vengono inizializzate prima della chiamata a main().
    • Le variabili globali con inizializzazione a zero (ad esempio, int i = 0;) vengono anch'esse inizializzate prima di main().
    • Le variabili definite con const o con durata di vita statica vengono inizializzate al caricamento del programma.
  • Disponibilità: Sono visibili in tutte le funzioni all'interno dell'ambito.

Variabili locali

  • Tempo di esistenza: Dalla definizione della variabile all'interno di un blocco di codice (funzione, ciclo, condizione, ecc.) fino all'uscita da quel blocco.
  • Luogo di memorizzazione: Di solito nello stack (per variabili automatiche). Le variabili locali statiche sono memorizzate nell'area di memoria statica.
  • Inizializzazione:
    • Le variabili locali automatiche non vengono inizializzate di default (contengono "dati spazzatura"). Richiedono un'inizializzazione esplicita.
    • Le variabili locali statiche vengono inizializzate una volta alla prima dichiarazione.
  • Disponibilità: Visibili solo all'interno del blocco di codice in cui sono definite.

Esempi

// Variabile globale
int global_variable = 10;

void some_function() {
    // Variabile locale (automatica)
    int local_variable_1; // Non inizializzata

    // Variabile locale (automatica) con inizializzazione
    int local_variable_2 = 20;

    // Variabile locale statica
    static int static_local_variable = 30; // Viene inizializzata una volta

    // Accesso alla variabile globale
    global_variable++;

    // Accesso alle variabili locali
    local_variable_1 = global_variable;
    static_local_variable++;

    // Dopo l'uscita da some_function(), local_variable_1 e local_variable_2 cessano di esistere
    // static_local_variable continua ad esistere, mantenendo il suo valore
}

int main() {
    some_function();
    some_function(); // static_local_variable ha mantenuto il suo valore
    // La variabile globale è disponibile qui
    // local_variable_1 e local_variable_2 non sono accessibili

    return 0;
}

Tabella di confronto

Caratteristica Variabili globali Variabili locali (automatiche) Variabili locali statiche
Tempo di esistenza Dall'avvio del programma fino alla sua terminazione Dalla definizione fino all'uscita dal blocco di codice Dal primo raggiungimento della definizione fino alla fine del programma
Luogo di memorizzazione Area di memoria statica (.data, .bss) Stack Area di memoria statica (.data, .bss)
Inizializzazione Prima della chiamata a main() o al caricamento del programma Non inizializzate di default. Richiedono inizializzazione esplicita Una volta alla prima dichiarazione
Disponibilità Ovunque nel scope del file Solo all'interno del blocco di codice Solo all'interno del blocco di codice