Qual è lo stato predefinito delle variabili?
-
06-07-2019 - |
Domanda
Quando viene avviato un programma C e le variabili vengono assegnate alle posizioni di memoria, lo standard C indica se quel valore è inizializzato?
// global variables
int a;
int b = 0;
static int c;
Nel codice sopra, 'b' verrà inizializzato su 0. Qual è il valore iniziale di 'a'? 'C' è diverso dal momento che è statico per questo modulo?
Soluzione
Dato che menzioni specificamente variabili globali : nel caso di variabili globali, indipendentemente dal fatto che siano dichiarate statiche
, verranno inizializzate su 0.
?? locali saranno invece indefinite (a meno che non vengano dichiarate statiche
, nel qual caso verranno inizializzate anche su 0 - grazie Tyler McHenry). Tradotto, ciò significa che non puoi fare affidamento sul fatto che contengano qualcosa di particolare: conterranno semplicemente qualsiasi rifiuto casuale già in memoria in quella posizione, che potrebbe essere diverso da una corsa all'altra.
Altri suggerimenti
Modifica: Quanto segue si applica solo alle variabili locali, non ai globali.
Il valore iniziale di una variabile non è definito. In alcune lingue, la posizione di una variabile in memoria non è dichiarata al momento della dichiarazione, ma in C (e anche C ++) una variabile non inizializzata conterrà qualsiasi spazzatura che vive in quella posizione in quel momento.
Quindi il modo migliore per pensarci è che una variabile non inizializzata conterrà molto probabilmente spazzatura e avrà un comportamento indefinito.
a
sarà zero e anche c
, se sono globali e non inizializzati esplicitamente. Questo vale anche per le variabili statiche locali.
Non vengono inizializzate solo variabili locali non statiche. Anche la memoria allocata con malloc non è inizializzata.
Vedi qui
per le regole di inizializzazione e allocazione in C per i diversi oggetti.
Sto scrivendo troppo lentamente stamattina. Tre persone sono intervenute rapidamente mentre rispondevo, quindi ho rimosso gran parte del mio post. Il link che ho trovato era chiaro e breve, quindi sto pubblicando comunque che: Wikipedia su " variabile non inizializzata " per una discussione delle questioni di base.
Un test rapido mostra a e c come 0.
int a;
static int c;
int main() {
printf("%d %d\n", a, c);
return 0;
}
La posizione di a (e c) viene determinata in fase di compilazione; cioè, non vengono né messi in pila né in un intervallo di memoria restituito da malloc. Penso che lo standard C dice che sono inizializzati su 0 in tutti i casi, quindi.
Sono fiducioso al 99,9% rispetto a c
e al 98% rispetto a a
. La parola chiave static
, nel contesto delle variabili globali, è in realtà analoga a private
in (diciamo) C ++ e Java: si tratta di visibilità, non di posizione di archiviazione.
Ciò che Andrew Hare dice sulle variabili non inizializzate è vero per i dati archiviati nello stack o nella memoria malloc. Non così per le variabili memorizzate staticamente.