C Language Uso di una variabile non inizializzata


Esempio

int a; 
printf("%d", a);

La variabile a è un int con durata di archiviazione automatica. Il codice di esempio di cui sopra sta tentando di stampare il valore di una variabile non inizializzata ( a non è mai stato inizializzato). Le variabili automatiche non inizializzate hanno valori indeterminati; l'accesso a questi può portare a comportamenti non definiti.

Nota: le variabili con memoria locale statica o thread, comprese le variabili globali senza la parola chiave static , vengono inizializzate su zero o il loro valore inizializzato. Quindi il seguente è legale.

static int b;
printf("%d", b);

Un errore molto comune è quello di non inizializzare le variabili che fungono da contatori a 0. Si aggiungono valori a loro, ma poiché il valore iniziale è spazzatura, si invocherà il comportamento indefinito , come nella domanda La compilazione sul terminale emette un avviso del puntatore e simboli strani .

Esempio:

#include <stdio.h>

int main(void) {
    int i, counter;
    for(i = 0; i < 10; ++i)
        counter += i;
    printf("%d\n", counter);
    return 0;
}

Produzione:

C02QT2UBFVH6-lm:~ gsamaras$ gcc main.c -Wall -o main
main.c:6:9: warning: variable 'counter' is uninitialized when used here [-Wuninitialized]
        counter += i;
        ^~~~~~~
main.c:4:19: note: initialize the variable 'counter' to silence this warning
    int i, counter;
                  ^
                   = 0
1 warning generated.
C02QT2UBFVH6-lm:~ gsamaras$ ./main
32812

Le regole di cui sopra sono applicabili anche per i puntatori. Ad esempio, i seguenti risultati nel comportamento non definito

int main(void)
{
    int *p;
    p++; // Trying to increment an uninitialized pointer.
}

Si noti che il codice precedente potrebbe non causare un errore o un errore di segmentazione, ma provare a dereferenziare questo puntatore in un secondo momento causerebbe un comportamento indefinito.