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?

È stato utile?

Soluzione

Dato che menzioni specificamente variabili globali : nel caso di variabili globali, indipendentemente dal fatto che siano dichiarate statiche , verranno inizializzate su 0.

Le variabili

?? 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top