2013-03-10 9 views
7

C:come i valori della spazzatura vengono assegnati alle variabili in codice C

int a; 
printf("\n\t %d",a); // It'll print some garbage value; 

Così come si fa queste spazzatura valori vengono assegnati alle variabili non inizializzate dietro le tende in C?

Significa che C assegna prima la memoria alla variabile 'a' e quindi che cosa c'è in quella posizione di memoria diventa valore di 'a'? o qualcos'altro?

+0

Leggi http: // markshroyer.it/2012/06/c-both-true-and-false/ –

+2

Sebbene ciò non avvenga con questo codice specifico, se "int a;" viene dichiarato nell'ambito del file (al di fuori di qualsiasi funzione), sarà inizializzato con 0 automaticamente. – teppic

+0

@teppic: 'static int a;' verrà automaticamente inizializzato a zero indipendentemente dal suo ambito. – Destructor

risposta

9

Significa che C prima assegna la memoria alla variabile 'a' e quindi che cosa c'è in quella posizione di memoria diventa valore di 'a'?

Esattamente!

Fondamentalmente, C non fa nulla non lo si dice. Questa è la sua forza e la sua debolezza.

+1

Non è corretto dire" Esatto! "Lo standard C richiede che un oggetto non inizializzato abbia un valore non specificato. Tuttavia, non puoi assumere che quel valore sarà il valore nella memoria in cui l'oggetto viene assegnato per questo. A seconda dell'ottimizzazione e di altri comportamenti del compilatore, il valore può essere preso da un registro o da una posizione di stack temporanea diversa dalla memoria assegnata o altrove. –

+1

@EricPostpischil grazie per i dettagli extra. Ci sono molte cose che accadono quando si compila un software troppo esteso per coprire una semplice domanda come questa. –

6

significa C alloca primo ricordo alla variabile 'a' e poi cosa mai v'è in quella posizione di memoria diventa valore 'a'? o qualcos'altro?

Corretto. Vale la pena ricordare che "l'allocazione" di variabili automatiche come int a è praticamente inesistente, dal momento che tali variabili sono memorizzate nello stack o in un registro CPU. Per le variabili memorizzate nello stack, l'allocazione viene eseguita quando viene chiamata la funzione e si riduce ad un'istruzione che sposta il puntatore dello stack di uno scostamento fisso calcolato al momento della compilazione (la memoria combinata di tutte le variabili locali utilizzate dalla funzione, arrotondato al corretto allineamento).

Il valore iniziale delle variabili assegnate ai registri della CPU è il contenuto precedente del registro. A causa di questa differenza (registro contro memoria) a volte accade che i programmi che funzionano correttamente quando compilati senza ottimizzazione iniziano a rompersi quando compilati con l'ottimizzazione attivata. Le variabili non inizializzate, che in precedenza indicavano la posizione che era stata inizializzata a zero, ora contengono i valori degli usi precedenti dello stesso registro.

0

Inizialmente la memoria ha alcuni valori, quelli sono valori sconosciuti, chiamati anche valori di spazzatura, quando dichiariamo una variabile, qualche memoria è stata riservata per la variabile in base al tipo di dati specificato durante la dichiarazione, quindi il valore iniziale della memoria è sconosciuto valore, se inizializziamo qualche altro valore allora il nostro valore sarà in quella posizione di memoria.

1

int a;

Durante la dichiarazione di una variabile, la memoria viene allocata. Ma questa variabile non è assegnata, il che significa che la variabile a non è inizializzata. Se questa variabile a viene dichiarata solo ma non più utilizzata nel programma, viene chiamata valore immondizia. Per esempio:

int a, b; 

b=10; 
printf("%d",b); 
return 0; 

Qui è solo dichiarata ma non è più assegnato o inizializzato. Quindi questo è chiamato valore immondizia.

Problemi correlati