Puntatori come parametri

di il
3 risposte

Puntatori come parametri

Stavo creando un albero binario in C, sono molto alle prime armi e vorrei chiedervi la differenza tra questo:

Foglia* CreaFoglia(int d){
  Foglia*n = (Foglia*)malloc(sizeof(Foglia));
  n->dato = d;
  n->sx = NULL;
  n->dx = NULL;
  return n;
  }
e questo:

Foglia* CreaFoglia(int d){
  Foglia nu;
  nu.dato = d;
  nu.sx = NULL;
  nu.dx = NULL;
  Foglia* n = ν
  return n;
}
Il primo funziona l'ho testato, il secondo no e non capisco perchè... errori di sintassi non ce ne sono...

3 Risposte

  • Re: Puntatori come parametri

    Questo e' un STRA-SUPER-ULTRA-MEGA-GIGA-TERA-PETA-EXA-EPTA-OCTA GRAVE ERRORE di semantica!

    (robbbbba da licenziamento in tronco/defenestramento durante la sessione d'esame )
    (vabbe, scherzo, ma e' un errore ESTREMAMENTE grave!!!)


    Il pasticcio fatto nel SECONDO pezzetto di codice ha a che fare con la parte MOOOOOOOLTO COMPLICATA della GESTIONE DELLA MEMORIA in C/C++, ed il concetto di SCOPE di una variabile!
    
    Foglia nu;
    
    ALLOCA la variabile "nu' NELL STACK
    
    Foglia* n = ν
    
    ASSEGNA ad n l'INDIRIZZO di nu. MA nu E' ALLOCATA nello stack
    
    return n;
    
    ritorna, alla funzione chiamante, il VALORE di n. Questo valore e' l'INDIRIZZO di nu SULLO STACK.

    MEGA/GIGA/STRA PROBLEMONE!!!!!

    All'uscita della funzione "CreaFoglia", la variabile "nu" NON ESISTE PIU'.

    Piu' specificatamente: l'indirizzo ESISTE ancora, MA QUELL"AREA DI MEMORIA, prima DEDICATA a "nu", PUO' ESSERE RIUSATA da qualunque altra funzione. In pratica STAI PUNTANDO AD UN'INDIRZZO di memoria CHE NON E' PIU' di tua proprieta'!

    DISASTRO ASSICURATO.

    E ROGRA STRA-MEGA-ROGNOSA da identificare!!!!

    In un programma complesso, ci puoi impiegare anche MESI per trovare un errore del genere!
    Perche' potresti avere anche la SUPREMA SFORTUNA che quell'area venga riscritta con valori che SEMBRANO valori validi, con la conseguenza che il programma SEMBRA FUNZIONARE, ma funziona in modo strano!!!

    Questo e' il PRINCIPALE motivo per cui i programmatori C/C++ DEVONO ESSERE programmatori DECISAMENTE ESPERTI!
  • Re: Puntatori come parametri

    Ora mi è molto più chiaro, ti ringrazio!!!!
  • Re: Puntatori come parametri

    Aggiungo a quanto detto da migliorabile che nel primo caso allochi nello heap - informati sulle differenze tra heap e stack.

    ps: posta nella sezione corretta
Devi accedere o registrarti per scrivere nel forum
3 risposte