PDA

Visualizza la versione completa : [C/C++] Che cos'è -858993460?, variabile non inizializzata


No_Rules
08-09-2010, 12:58
Ragazzi il mio prof di Informatica ci ha fatto questa domanda che potrebbe incuriosire molti.

Se provo a stampare una variabile int senza inizializzarla il numero visualizzato è il seguente:

-858993460

A cosa corrisponde? Perché è sempre lo stesso? Dipende dal compilatore?
Ho provato a cercare in giro ma non ho trovato nessun riferimento a quel numero, eppure lui dice che ha un significato...
Nel caso servisse io utilizzo Microsoft Visual C++ 6.0.

Vi ringrazio per l'aiuto.

MItaly
08-09-2010, 13:16
Non vuol dire niente; è semplicemente quel che si trova alla locazione di memoria attualmente utilizzata per quella variabile. Probabilmente in quel punto dello stack prima c'era una variabile o un indirizzo di ritorno o qualcos'altro ancora che aveva quel valore lì.

No_Rules
08-09-2010, 13:34
Si questo lo supponevo anche io, che ci venisse mostrato un qualcosa di preesistente in quella locazione di memoria, ma perché è sempre lo stesso numero...Sarebbe dovuto comunque essere diverso ogni volta no?

linoma
08-09-2010, 13:38
Questo nn succede xche usi una versione successiva a Windows 95/98 :D

MItaly
08-09-2010, 13:55
Originariamente inviato da No_Rules
Si questo lo supponevo anche io, che ci venisse mostrato un qualcosa di preesistente in quella locazione di memoria, ma perché è sempre lo stesso numero...Sarebbe dovuto comunque essere diverso ogni volta no?
Se il programma segue sempre lo stesso percorso di codice, senza che ci siano differenze tra un'esecuzione e l'altra, non dovrebbero esserci differenze.

Piuttosto, la cosa interessante è che ci siano stati dei dati in quella locazione di memoria se il tuo programma è composto solo dal main, dato che i sistemi operativi moderni di base ti forniscono pagine di memoria piene di zeri (per evitare che tu possa leggere i dati di altri processi da una pagina fisica precedentemente assegnata ad un altro processo) e, apparentemente, la zona più "in cima" allo stack a cui il tuo programma arriva sono appunto le variabili del main.
Questo probabilmente accade per via del main "nascosto", ossia il vero entrypoint dell'eseguibile che è preso dalla CRT, in cui il runtime richiama una serie di routine di inizializzazione. Probabilmente quel valore è stato messo sullo stack durante queste procedure.

Originariamente inviato da linoma
Questo nn succede xche usi una versione successiva a Windows 95/98 :D
:master:

Cell
08-09-2010, 14:38
Originariamente inviato da linoma
Questo nn succede xche usi una versione successiva a Windows 95/98 :D
Mi incuriosirebbe sapere il perché... :sbav: cos'hanno i sistemi operativi successivi a win98 di diverso da provocare ciò? :master:


P.S. Comunque il numero che esce dalla variabile non inizializzata, più che vederlo in base 10, sarebbe forse più interessante visualizzarlo in esadecimale (anche se non so che conclusioni se ne potrebbero trarre).

No_Rules
08-09-2010, 15:21
Il punto è che rifacendo un altro programma o anche inserendo un'altra variabile non inizializzata e poi mostrandola a video, il risultato è sempre quello. Qualunque variabile non inizializzata se stampata visualizza quel valore. E' questo che mi fa pensare che molto probabilmente non viene visualizzato un dato allocato in quell'indirizzo appartenente ad un altro processo, e quasi come ci fosse un valore di default, non so come spiegarmi...

Anche se lo visualizzo in esadecimale non cambia niente, perché comunque convertendo lo stesso numero si ha sempre lo stesso risultato, e la cosa strana è proprio che sia sempre uguale...

MItaly
08-09-2010, 15:44
Allora la questione è ancora differente; si tratta probabilmente di un valore che VC++ nelle build di debug usa come riempitivo sullo stack, appunto come segnale di variabile non inizializzata (in effetti -858993460 in esadecimale è 0xCCCCCCCC).
In versioni più recenti di VC++ se non ricordo male viene usato il pattern 0xCDCDCDCD, e l'heap di debug di Windows usa 0xBAADF00D :D .

No_Rules
08-09-2010, 15:46
Ecco quindi spiegato come sia per tutte uguale, è un valore di default come avevo supposto :D
Grazie mille

MItaly
08-09-2010, 15:49
Comunque, non farci affidamento: il riempimento con un pattern della memoria non inizializzata è semplicemente un favore che ti fa il compilatore nelle build di debug, di norma non potresti fare nessuna assunzione sul valore delle variabili non inizializzate (e questo, se si usano tipi in virgola mobile, può causare anche qualche problema); in particolare, quando compili in modalità release, il compilatore disattiva tutti questi aiuti al debug per favorire la velocità del codice (riempire la memoria con un pattern ha un costo non del tutto indifferente).

Loading