Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C/C++] Variabile senza valore

    Ho chiesto un pò in giro ma non horicevuto risposte complete.
    Stavo facendo un piccolo programma a scopo didattico per far capire l'uso di if quando per distrazione ho dimenticato di dare un valore ad una variabile X.

    Compilo, mi accorgo dell'errore e lo correggo.
    Però mi è rimasto un dubbio.

    La variabile X non aveva valore inizializzato.
    Ne 0 ne niente era solo dichiarata.

    Perchè al print di X mi dava 200536?

    Mi hanno fatto notare che è collegato alla mappatura fisica della memoria, che non è prevedibile, però non prende il valore da nulla.
    Allora? Che fa se lo inventa?

    Non ho ancora capito da dove deriva sto valore.

    Topolin, Topolin, viva Topolin!

  2. #2
    ma una variabile dichiarata cosi:
    codice:
    string nome;
    nn dovrebbe valere NULL(o 0) fino alla sua dichiarazione completa?
    Se in un primo momento l'idea non è assurda, allora non c'è nessuna speranza che
    si realizzi
    .
    Os: WinME
    Lang: C++
    Editor: C++ Builder 6 Enterprise

  3. #3
    Originariamente inviato da lucasp
    ma una variabile dichiarata cosi:
    codice:
    string nome;
    nn dovrebbe valere NULL(o 0) fino alla sua dichiarazione completa?
    Non gli da nessun valore. Anzi gli da un valore "a caso".
    E' questo che non capisco. Non mi pare logico che un compilatore dia un valore "a caso".

    Topolin, Topolin, viva Topolin!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 1999
    Messaggi
    88

    Dipende dal compilatore!

    Dipende dal compilatore.
    Alcuni inizializzano a zero o NULL, altri riservano solo lo spazio di memoria, senza cambiare il valore contenuto. Così il valore iniziale è quello precedentemente settato da un altro processo.

    Ciao.
    Paolomat
    VB - Java - C/C++ - VC - CORBA -JDBC

  5. #5
    Nel momento in cui si dichiara una variabile (almeno in linguaggi di medio/basso livello), non si effettua nessuna istruzione di spostamento dati; si indica semplicemente l'indirizzo dove tale variabile punterà (in fondo ogni variabile è un puntatore ad una zona di memoria). Questo significa che il compilatore non si preoccupa di dare un valore a tale zona, ma semplicemente di specificare dove tale zona sarà situata, senza nessuna inizializzazione. Certo, dipende dai compilatori. Può capita che se si dichiara un intero sia già inizializzato a 0, o una stringa a "", ma non è una cosa automatica. In fondo quando la memoria viene liberata non è detto che venga riportata a valore 0 per forza, perché l'unica cosa che il SO effettua è una "notifica" (in parole poverissime) per permettere che tale memoria possa essere utilizzata per nuovi programmi. E in quella memoria può starci qualunque cosa, a meno che il compilatore stesso non si preoccupi di inizializzarla. Se per esempio in VB l'inizializzazione è implicita (a dire il vero non sono sicuro che in esso vengano inizializzate le variabili..), in C dovrai specificarla tu:

    codice:
    Dim Intero As Integer
    ...
    int Intero = 0;
    Una cosa è certa: il fatto che il valore di una variabile non inizializzata sia astruso è più fedele a come la memoria è disposta davvero.

    Ciao.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    167
    In C o C++ na variabile viene inizializzata sempre a 0 se è una variabile globale, altrimenti il valore iniziale è indefinito.
    Ciao.

  7. #7
    Si ma la mia domanda a cui non riesco a trovare risposta è:
    come fa a decidere il valore?

    In che modo il compilatore decide di mettere 200000 piuttosto che 30000?

    Ho provato su Borland - Devc++ e gcc tutti valori diversi ma poi uguali tra di loro su compilazioni separate...
    quindi un parametro lo avranno.

    Topolin, Topolin, viva Topolin!

  8. #8
    Mi sa che ti sei un po' confuso. Non è che il compilatore assegni il valore 9835729 ad una variabile se non viene inizializzata esplicitamente. Non assegna proprio nessun valore. L'unica cosa che il compilatore fa (quando le variabili non vengono anche inizializzate) è dare significato alla variabile in termini di indirizzi di memoria. Cmq Level ha detto una cosa giusta, e la differenza sta nel fatto che le variabili globali stanno nel segmento dati, e quelle locali sullo stack.

    Le variabili globali corrispondono ad un indirizzo nell'heap (quando il programma in esecuzione), ma in effetti vengono inizializzate in fase di compilazione a valori standard (quale 0) e sono parte integrante del programma in fatto di dimensioni, perché vengono memorizzate proprio nello stesso file eseguibile.

    Le variabili locali vengono poste sullo stack, che è una parte della memoria soggetta a continui cambiamenti, perché come ho detto, è lì che vengono memorizzate le variabili locali. Tuttavia, il compilatore non si preoccupa di vedere cosa ci sia sullo stack, e si limita a dire in quale indirizzo dello stack tale variabile deve essere collocata. Nient'altro.

    Ciao.

  9. #9
    Originariamente inviato da r0x
    Mi sa che ti sei un po' confuso. Non è che il compilatore assegni il valore 9835729 ad una variabile se non viene inizializzata esplicitamente.
    Bene. Allora perchè se guardo la variabile mi da sempre 200536?

    Topolin, Topolin, viva Topolin!

  10. #10
    Prova a riavviare il PC e vedi se ti dà lo stesso valore.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.