Oppure

Loading
12/02/16 23:39
Salve, vorrei sapere la giusta procedura per il seguente problema:

ho una struttura di char * (puntatori per recepire stringhe)

struct prova{
char *uno;
char *due;
char *tre;
}provina;


devo allocare della memoria per creare le strutture che mi servono,
La procedura che penso sia giusta e':
malloc(struct prova);
malloc(uno);
malloc(due);
malloc(tre);

/* e poi a fine funzione */

free(prova);


mi chiedevo se la malloc per la struttura deve essere fatta prima o dopo le singole malloc dei puntatori
e se una free (prova) basta pure per i puntatori interni alla struttura, oppure è bene operare una free() per singolo puntatore?

p.s. non tenete conto molto della sintassi delle istruzioni che ho scritto, mi interessa capire il concetto.


grazie a tutti per l'aiuto.

Ultima modifica effettuata da 13/02/16 16:56
13/02/16 0:41
Roby94
La struttura dichiarata in quel modo è gia dichiarata e allocata con il nome provina, per tanto non serve allocare altro spazio per essa.

    typedef struct{
    char *uno;
    char *due;
    char *tre;
    }prova;

A questo punto prova è diventato un tipo, per tanto posso gestirla come preferisco
prova* a;
a = (prova*) malloc(sizeof(prova));


Per quanto riguarda i puntatori interni per ognuno dovrò eseguire l'allocazione dinamica mediante malloc.
provina.uno = (char*) malloc(n);


Il free va effettuato su ogni singolo puntatore all'heap, visto che C non implementa un GC.
aaa
13/02/16 9:58
Grazie!! oggi appena posso provo!
13/02/16 13:29
Postato originariamente da Mikelius:

Grazie!! oggi appena posso provo!


mi è successo un errore, se prima dealloco la memoria della struttura e dopo quella dei singoli puntatori ,
Se invece dealloco la memoria per i singoli puntatori e dopo quella per la struttura , tuttto ok (sembra)


13/02/16 13:58
Roby94
Ovviamente, se de allochi la struttura non hai più i riferimenti alle stringhe in essa contenute. Ma hai proprio necessità di usare la memoria dinamica anche per la struttura?
aaa
13/02/16 14:08
Template
È normale che ti compaia quell'errore, perchè quello che hai fatto non ha senso...

Quando usi la funzione free() su un dato, tu liberi la memoria precedentemente occupata da quel dato.
Questo vuol dire che, con l'istruzione:

free(prova);


Tu hai liberato la memoria occupata dalla struct, e cioè (più o meno) la memoria occupata dai tre puntatori che hai dichiarato... ora, ti rimane da liberare la memoria a cui i tre puntatori dentro la struct puntavano, ed è per questo che va chiamata una free() per ogni puntatore come ti ha detto Roby94. Ma, se tu ora scrivi:

free(prova.uno);


Di fatto scrivi una cosa priva di senso: cerchi di deallocare della memoria effettivamente deallocabile, e questo va bene, ma lo vuoi fare utilizzando per identificarla un puntatore che non esiste più, perchè l'hai già deallocato con la prima istruzione.

Questo è il motivo per cui va deallocata prima la memoria cui si riferiscono i puntatori, e solo dopo quella occupata dai puntatori stessi: perchè, altrimenti, ti ritroveresti con della memoria effettivamente irraggiungibile (avendo tu "cancellato" i puntatori che ti permettevano di raggiungerla).
aaa
13/02/16 15:02
Postato originariamente da Template:

È normale che ti compaia quell'errore, perchè quello che hai fatto non ha senso...

Quando usi la funzione free() su un dato, tu liberi la memoria precedentemente occupata da quel dato.
Questo vuol dire che, con l'istruzione:

free(prova);


Tu hai liberato la memoria occupata dalla struct, e cioè (più o meno) la memoria occupata dai tre puntatori che hai dichiarato... ora, ti rimane da liberare la memoria a cui i tre puntatori dentro la struct puntavano, ed è per questo che va chiamata una free() per ogni puntatore come ti ha detto Roby94. Ma, se tu ora scrivi:

free(prova.uno);


Di fatto scrivi una cosa priva di senso: cerchi di deallocare della memoria effettivamente deallocabile, e questo va bene, ma lo vuoi fare utilizzando per identificarla un puntatore che non esiste più, perchè l'hai già deallocato con la prima istruzione.

Questo è il motivo per cui va deallocata prima la memoria cui si riferiscono i puntatori, e solo dopo quella occupata dai puntatori stessi: perchè, altrimenti, ti ritroveresti con della memoria effettivamente irraggiungibile (avendo tu "cancellato" i puntatori che ti permettevano di raggiungerla).



Questo era il mio dilemma principale... se deallocando la memoria per la struttura, in automatico si deallocasse pure quella dei singoli campi... ho messo le istruzioni nel giusto ordine
13/02/16 15:59
Template
Postato originariamente da Mikelius:

Questo era il mio dilemma principale... se deallocando la memoria per la struttura, in automatico si deallocasse pure quella dei singoli campi


L'allocazione dinamica avviene nell'heap, che è una porzione di memoria di solito non gestita dai sistemi operativi e dunque a totale carico delle applicazioni che la impiegano.
Alcuni linguaggi implementano un sistema di Garbage Collection che si occupa, tra le altre cose, di liberare automaticamente la memoria heap... in C, un sistema del genere non esiste, e dunque la gestione dell'heap è a pieno carico del programmatore.
aaa