La risposta breve? Dipende dal compilatore, ma non farlo.
La risposta lunga:
Accesso al valore di un inizializzati POD (vecchi dati semplici, come int
) Tipo richiama comportamento indefinito, il che significa che lo standard C non pone requisiti su un conforme attuazione in questa situazione. Pertanto, un compilatore è autorizzato a emettere codice macchina che avvia nethack
, formatta il disco rigido o non esegue affatto, pur rimanendo conforme allo standard C, purché possa dimostrare che un comportamento indefinito si verifica in qualsiasi punto del programma.
(Leggi anche: What Every C Programmer Should Know About Undefined Behavior)
Quindi, ciò che in realtà (probabilmente) succede?
Nella maggior parte dei compilatori moderni senza ottimizzazione abilitata, il compilatore assegnerà semplicemente uno slot nello stack (o un registro) alla variabile, quindi accederà a ciò che era in quella posizione prima di quando richiesto. Il risultato è ciò che sembra essere "memoria casuale", sebbene in realtà sia it's not very random at all.
Che cosa succede se abilitato le ottimizzazioni?
Se poi si va a compilare il codice su un livello di ottimizzazione più elevato (o il compilatore viene aggiornato e ora si ottimizza in modo più aggressivo), tutte le scommesse sono disattivate.Ad esempio, il compilatore può rimuovere qualsiasi chiamata che coinvolge x
, assegnare x
alla stessa posizione di alcune altre variabili (sostenendo che non è possibile utilizzare x
, poiché non è ancora inizializzato) o any other combination of strange effects.
In altre parole, nel momento in cui si accede a tale variabile non inizializzata, il proprio programma può iniziare a fare qualsiasi cosa che sia fuori dal proprio controllo. Non farlo - ecco i draghi.
http://research.swtch.com/openssl –
Basta provarlo, lanciare più volte il tuo programma stampando il valore della variabile: vedrai che è lungi dall'essere utilizzabile come valore casuale – Antonio
che ho fatto. E mi dà lo stesso valore ogni volta. Come funziona la deallocazione della memoria C? –