Per esempio non ho mai visto il tipo %x
Gli indirizzi di memoria sono spesso scritti in esadecimale e lo specificatore di formato %x serve appunto per stampare valori esadecimali.
è poco che studio informatica, potrei avere qualche lacuna nel mio studio che non mi permette di identificare il problema. Potreste degnarvi, voi sommi programmatori, di abbassarvi al mio livello e spiegarmi semplicemente dove sta l'errore senza sollevare nuovi punti di domanda? O siete troppo superiori? Mamma mia quanta saccenza...
Per quanto mi riguarda non sono un "sommo programmatore", ma un dilettante che utilizza la programmazione come esercizio di logica!
Se hai notato della saccenza mi dispiace, ma il mio scopo, visto anche il tuo corso di studi e visto che le liste concatenate non sono certo tra i primi argomenti ad essere affrontati in un corso di informatica, era semplicemente quello di indurti a ragionare.
Il codice che ho postato si limita a stampare per due volte il contenuto (un indirizzo di memoria) di uno stesso puntatore. Tra i due printf() però viene invocata la funzione fun() che setta a NULL (di solito pari a 0) il puntatore passato alla funzione. Lanciando il programma si nota però che in entrambi i casi viene stampato lo stesso indirizzo di memoria:
- se questo è l'output che ti saresti aspettato, allora quello nel codice da te postato è solo un errore di distrazione;
- se invece ti saresti aspettato due valori diversi allora bisogna ragionare su cosa non ha funzionato.
Il problema è che il passaggio della variabile p alla funzione fun() avviene per valore. Al riguardo riporto un frammento di un mio recente post in un altro topic:
Nippolo ha scritto:
In C il passaggio di un parametro ad una funzione avviene sempre per valore.
Quando esegue la chiamata di una funzione, il programma costruisce una copia di ogni argomento, creando delle variabili locali nell'ambito della funzione; ciò significa che tutte le modifiche, fatte dalla funzione al valore di un argomento, hanno effetto soltanto nell'ambito della funzione stessa.
Se invece si vuole che le modifiche apportate dalla funzione all'argomento non vadano perdute, bisogna modificare l'argomento attraverso il suo indirizzo di memoria. Ciò significa che in C, per simulare un passaggio per riferimento, bisogna passare alla funzione un puntatore di ordine superiore rispetto alla variabile che si vuole modificare attraverso la funzione.
Esempi:
- variabile di tipo int ==> argomento di tipo int*;
- variabile di tipo char* ==> argomento di tipo char**;
- variabile di tipo float*** ==> argomento di tipo float****.
Quindi tornando al tuo codice, tutte le modifiche apportate all'argomento Testa dalla funzione CreaRiempiLista() andranno perse una volta tornati al main().
Sottolineo ancora una volta che non ho letto approfonditamente il codice che hai postato, ma mi sono limitato a portare alla tua attenzione il primo errore che mi è balzato agli occhi. Se una volta corretto il suddetto errore noti che il programma continua a non funzionare facci sapere e nel caso possiamo ragionarci.