Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    35

    [C/C++] Che cos'è -858993460?, variabile non inizializzata

    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.

  2. #2
    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ì.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    35
    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?

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Questo nn succede xche usi una versione successiva a Windows 95/98
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    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
    :master:
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    117
    Originariamente inviato da linoma
    Questo nn succede xche usi una versione successiva a Windows 95/98
    Mi incuriosirebbe sapere il perché... 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).

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    35
    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...

  8. #8
    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 .
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    35
    Ecco quindi spiegato come sia per tutte uguale, è un valore di default come avevo supposto
    Grazie mille

  10. #10
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.