ma non bisognerebbe rilasciare la mem allocata?
io non lo faccio mai perchè non saprei QUANDO farlo
ma non bisognerebbe rilasciare la mem allocata?
io non lo faccio mai perchè non saprei QUANDO farlo
Ti riferisci al fflush(stdin)? Ogni volta che schiacci un tasto, il suo valore viene riposto in un buffer. Quando tu chiami scanf(), è come se andassi a leggere il contenuto di tale buffer, ma niente ti assicura che il buffer venga svuotato quando richiami scanf(). Se non viene svuotato (e capita spesso) scanf() legge lo stesso valore di prima, e tu sei punto a capo =) Adesso stai usando gcc su OS X o su linux? O stai usando win? Perché il funzionamento di scanf non sempre è lo stesso...
*dimenticavo, in conclusione usi fflush(stdin) prima di ogni scanf() o subito dopo, in modo da garantire che alla prossima chiamata di scanf il buffer sia vuoto. Se lo fai prima di chiamare scanf, sei sicuro al 100% che il buffer sia vuoto
no ,perdonami.. mi sono piegato male mi riferivo al free()
ma non ti sto facendo studiare?
sto usando OS X cmq uso quasi sempre mac per studiare.. o al max linux.. mai provato un dev C su win
su os x il problema si presenta e non si presenta, dipende.. cmq per sicurezza usa fflush
Il free lo usi quando deallochi, ovvero quando non ti serve più un elemento e, per tenere tutto più ordinato e dar spazio all'efficienza, lo elimini dalla memoria (sbianchi un pezzettino di ram ).
preiser dopo un pomeriggio intero devo inchinarmi.. sto man mano facendo mie le liste.. e stano diventando meno ostiche di quanto credevo che fossero.. grazie, grazie grazie e grazie..
ho ancora solo una domanda per il momento..
perchè scriviamo ad esempio
lista=NULL
e non
lista->succ=NULL
?
In C, come in ogni altro linguaggio, appena dichiari una variabile, inizializzala, altrimenti vai incontro a inconvenienti. In generale i compilatori inizializzano le variabili a dei valori "standard": gli int a 0, i char a 0, i float a 0, ma i puntatori.. eheh, dipende!
Fai una prova (se vuoi) col codice che ti posto. A me, su OS X, ha dato risultati diversi a ogni chiamata di printf. Se tu avessi usato il puntatore senza assegnarli NULL, avresti fatto un grosso errore!
Regola d'oro del C: inizializza tutto subito!
PS: cosa succede se utilizzi un puntatore non inizializzato? Semplicemente, non sai cosa può accadere, nel senso che il puntatore può puntare ad una qualsiasi area di memoria che (nel 99.9999% dei casi) non contiene quel che ti serve. In sunto, il programmino crasha
codice:#include <stdio.h> #include <stdlib.h> int main() { char *pointer; printf("Indirizzo a cui punta il puntatore: %d", pointer); pointer = NULL; printf("\nIndirizzo a cui punta il puntatore dopo l'inizializzazione: %d", pointer); pointer = (char *)malloc(sizeof(char)); printf("\nIndirizzo a cui punta il puntatore dopo il malloc(): %d", pointer); return 0; }
si si, questo lo sapevo.. infatti in genere punta ad un indirizzo che nemmeno può aprire e crasha.. la mia domanda era..
lista è un puntatore
lista->succ è un puntatore
perchè inizializziamo lista così
lista=NULL
e non inizializziamo lista->succ così
lista->succ=NULL
?
il secondo caso genera un errore
Uhm, sono un po' fuso, forse non ho capito bene io o forse non l'ho spiegato prima. Appena creai un puntatore, qualunque esso sia, o lo inizializzi con un valore o lo setti subito a NULL. Io per abitudine, scrivo così:
char *puntatore = NULL;
puntatore = (char *) malloc(12345 * sizeof(char));
o così:
char *puntatore = (char *)malloc(12345 * sizeof(char));
sono entrambi equivalenti, ma l'importante è che non lo lasci in sospeso. Facciamo lista->succ = NULL così tappiamo subito il puntatore al prossimo elemento, perché in quel punto del codice non è detto che sai già se esisterà o meno un prossimo elemento.
Poi dimmi se non ho capito a cosa ti riferisci, sorry
Ah aspetta, forse ho capito. Ti riferisci proprio alle prima righe del codice?
lista myList = NULL;
e mi chiedi come mai non facciamo
myList->succ = NULL;
? Se sì, non lo possiamo proprio fare, perché myList non punta da nessuna parte, e non avendo allocato spazio per una nuova struttura (e non avendo neanche l'indirizzo di memoria in cui è allocata questa struttura) non possiamo puntare a succ.