Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [risolto][c]-Allocazione Memoria Struttura
Forum - C/C++ - [risolto][c]-Allocazione Memoria Struttura

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Salve, vorrei sapere la giusta procedura per il seguente problema:

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

Codice sorgente - presumibilmente C++

  1. struct prova{
  2. char *uno;
  3. char *due;
  4. char *tre;
  5. }provina;



devo allocare della memoria per creare le strutture che mi servono,
La procedura che penso sia giusta e':
Codice sorgente - presumibilmente Plain Text

  1. malloc(struct prova);
  2. malloc(uno);
  3. malloc(due);
  4. malloc(tre);
  5.  
  6. /* e poi a fine funzione */
  7.  
  8. 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 il 13/02/2016 alle 17:56
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 1:41
Sabato, 13/02/2016
La struttura dichiarata in quel modo è gia dichiarata e allocata con il nome provina, per tanto non serve allocare altro spazio per essa.
Codice sorgente - presumibilmente C++

  1. typedef struct{
  2.     char *uno;
  3.     char *due;
  4.     char *tre;
  5.     }prova;


A questo punto prova è diventato un tipo, per tanto posso gestirla come preferisco
Codice sorgente - presumibilmente Plain Text

  1. prova* a;
  2. a = (prova*) malloc(sizeof(prova));



Per quanto riguarda i puntatori interni per ognuno dovrò eseguire l'allocazione dinamica mediante malloc.
Codice sorgente - presumibilmente Plain Text

  1. provina.uno = (char*) malloc(n);



Il free va effettuato su ogni singolo puntatore all'heap, visto che C non implementa un GC.


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 10:58
Sabato, 13/02/2016
Grazie!! oggi appena posso provo!

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:29
Sabato, 13/02/2016
Testo quotato

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)



PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 14:58
Sabato, 13/02/2016
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?


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 175
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 15:08
Sabato, 13/02/2016
È 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:

Codice sorgente - presumibilmente Plain Text

  1. 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:

Codice sorgente - presumibilmente Plain Text

  1. 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).


"Nel curriculum scrivete quello che sapete fare... e anche quello che non sapete fare! Tipo: "Già vescovo di Cracovia, partecipai alla Coppa America, vincendola!""
[...]
"Sto giocando al piccolo Dio e mi sta venendo pure alla grande."
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:02
Sabato, 13/02/2016
Testo quotato

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:

Codice sorgente - presumibilmente Plain Text

  1. 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:

Codice sorgente - presumibilmente Plain Text

  1. 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

PM Quote
Avatar
Template (Member)
Pro


Messaggi: 175
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 16:59
Sabato, 13/02/2016
Testo quotato

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.


"Nel curriculum scrivete quello che sapete fare... e anche quello che non sapete fare! Tipo: "Già vescovo di Cracovia, partecipai alla Coppa America, vincendola!""
[...]
"Sto giocando al piccolo Dio e mi sta venendo pure alla grande."
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:56
Sabato, 13/02/2016
Testo quotato

Postato originariamente da Template:


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.



in c++ e java mi pare sia cosi, grazie per le info.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo