valori immondizia in C / C ++

Possibile duplicato:
Come una variabile non inizializzata ottiene un valore spazzatura?

Come vengono generati i valori garbage in C e C ++? Il compilatore usa una tecnica di generazione di numeri casuali per generare valori di garbage?

Se intendi i valori delle variabili non inizializzate, quelli non vengono generati. Sono solo i rifiuti che si trovavano in quella posizione di memoria.

int *foo = new int; std::cout << *foo << std::endl; 

New ha restituito un puntatore a qualche indirizzo in memoria. Quel pezzo di RAM è sempre esistito; non c'è modo di sapere cosa è stato memorizzato lì prima. Se è stato appena richiesto dal sistema operativo, sarà probabilmente pari a 0 (il sistema operativo cancellerà i blocchi di memoria prima di emetterli per motivi di sicurezza). Se è stato precedentemente utilizzato dal tuo programma, chi lo sa.

In realtà, i risultati dell'utilizzo di una variabile non inizializzata non sono definiti. Potresti ottenere un numero imprevedibile, il tuo programma potrebbe bloccarsi o peggio.

Anche se sai che è sicuro eseguire quanto sopra sulla tua piattaforma, non dovresti fare affidamento su ciò dando un valore casuale. Apparirà casuale, ma probabilmente è un po 'più prevedibile e controllabile di quanto vorresti. Inoltre, la distribuzione non sarà neanche lontanamente uniforms.

Se per “valori di spazzatura” intendete i valori delle variabili non inizializzate, non lo fa – il valore di una variabile non inizializzata non è definito dallo standard. Il valore di spazzatura a cui stai pensando è in realtà solo ciò che è accaduto per essere memorizzato in quella memoria proprio prima che la memoria della variabile fosse allocata dallo stack o dall’heap.

Detto questo, alcuni compilatori offrono strumenti di debug che colmano le variabili non inizializzate con alcuni noti “numeri magici” per aiutarti a individuare errori di questo tipo. Ad esempio, Microsoft Visual C ++ riempie le variabili stack non inizializzate con 0xCCCCCCCC. Questi sono specifici per il compilatore e in genere richiedono la compilazione con il debug triggersto.

La memoria che il tuo programma sembra utilizzare emerge in qualche stato, controllato da come gli elettroni fluivano all’accensione, proprietà divertenti del silicio, cosa c’era prima nella memoria e talvolta raggi cosmici.

Non è casuale, ma è estremamente difficile da prevedere.