View Full Version : [C] liberare memoria array
Shotokhan
24-01-2008, 15:19
saraga se ho un vettore di strutture dikiarato in questa maniera:
pmem array[128];
dv pmem è il tipo della struttura (fatta con il typedef) per eliminare dalla memoria un elemento del vettore ad esempio l'elemento array[56] posso usare la funzione free oppure non essendo un puntatore nn posso farlo? xkè se posso usare la free mi basta scrivere free(&(array[56])) e basta altrimenti nn so come fare... forse dikiarando NULL l'elemento. consigliatemi please :rolleyes:
trallallero
24-01-2008, 16:16
saraga se ho un vettore di strutture dikiarato in questa maniera:
pmem array[128];
dv pmem è il tipo della struttura (fatta con il typedef) per eliminare dalla memoria un elemento del vettore ad esempio l'elemento array[56] posso usare la funzione free oppure non essendo un puntatore nn posso farlo? xkè se posso usare la free mi basta scrivere free(&(array[56])) e basta altrimenti nn so come fare... forse dikiarando NULL l'elemento. consigliatemi please :rolleyes:
:wtf:
ma pmem come è typedeffato ?
se è un array di puntatori puoi fare free(array[56])
se è un array di char o simili non devi liberare proprio niente
Shotokhan
24-01-2008, 16:21
pmem è una struct ke contiene 3 interi e una stringa ma non come vettore di puntatori bensì dichiarato come un normalissimo vettore e cioè:
char* pag[503]
io nn ricordo come devo fare a cancellare questa struct e a lasciare come vuota, cioè come quando il vettore era ancora vuoto :rolleyes:
trallallero
24-01-2008, 16:26
pmem è una struct ke contiene 3 interi e una stringa ma non come vettore di puntatori bensì dichiarato come un normalissimo vettore e cioè:
char* pag[503]
io nn ricordo come devo fare a cancellare questa struct e a lasciare come vuota, cioè come quando il vettore era ancora vuoto :rolleyes:
beh io me ne sto andando a casa, ma se spieghi meglio la struttura e tutto il resto magari ti si può aiutare meglio, mica siamo indovini ;)
Shotokhan
24-01-2008, 16:33
questa è la struttura:
typedef struct pagMem{
byte pag[503];
long id;
time_t data;
short block_id:7;
}pmem;
io ho un vettore di queste strutture e devo fare una funzione ke elimina una struttura dal vettore, in pratica lascia lo spazio di memoria occupato dalla casella del vettore proprio come quando il vettore è stato appena inizializzato
Ziosilvio
24-01-2008, 16:39
saraga se ho un vettore di strutture dikiarato in questa maniera:
pmem array[128];
dv pmem è il tipo della struttura (fatta con il typedef) per eliminare dalla memoria un elemento del vettore ad esempio l'elemento array[56] posso usare la funzione free oppure non essendo un puntatore nn posso farlo? xkè se posso usare la free mi basta scrivere free(&(array[56])) e basta altrimenti nn so come fare... forse dikiarando NULL l'elemento. consigliatemi please :rolleyes:
Sei cortesemente pregato di riformulare la tua richiesta: questo è un forum in italiano, e il tuo post è evidentemente in qualche cappero d'altra lingua.
E, ovviamente, non puoi usare free per liberare memoria allocata staticamente.
Shotokhan
24-01-2008, 18:56
quel problema l'ho risolto! :D ora volevo sapere come faccio a deallocare la memoria riservata ad un intero se è possibile farlo in quanto prima di liberare la memoria allocata per una struttura devo liberare la memoria allocata per ogni elemento all'interno di essa.
Sei cortesemente pregato di riformulare la tua richiesta: questo è un forum in italiano, e il tuo post è evidentemente in qualche cappero d'altra lingua. ROTFL!! :rotfl:
ti arrabbi per così poco? guarda che si è visto ben di peggio!! :D
dai un'occhiata ai post dell'utente $te :asd:
una volta l'ho pure cazziato :asd: :asd:
Ziosilvio
24-01-2008, 19:52
quel problema l'ho risolto! :D ora volevo sapere come faccio a deallocare la memoria riservata ad un intero se è possibile farlo in quanto prima di liberare la memoria allocata per una struttura devo liberare la memoria allocata per ogni elemento all'interno di essa.
Spero di ricordarmi abbastanza C... mi sono abituato troppo bene con Python :fiufiu:
Devi chiamare free prima sui (puntatori ai) campi della struttura per i quali è prevista un'allocazione dinamica; e poi sul( puntatore al)la struttura.
Ad esempio, se hai:
struct prova {
int c;
char *name;
};
struct prova *p;
allora, per deallocare la struttura puntata da p, fai:
free(p->name);
free(p);
In circostanze come queste, conviene fare sempre in modo che, quando allochi dinamicamente una struct prova, il suo campo name viene o riempito, oppure inizializzato a NULL. In caso contrario, cosa succede quando provi a liberare p->name lo sa soltanto Cthulhu...
Shotokhan
24-01-2008, 21:10
chi sarebbe Cthulhu? :confused: cmq grazie dell'aiuto :D
chi sarebbe Cthulhu? :confused: cmq grazie dell'aiuto :D
Il fratello furbo di Ktulu.
Shotokhan
24-01-2008, 22:59
ragazzi sapete se è corretto scrivere una cosa del genere:
int *prova:7;
cioè, se uso il bitfield su un puntatore ad intero mi ritrovo un puntatore di 7 bit ad un intero oppure un puntatore ad un intero di 7 bit?
AnonimoVeneziano
24-01-2008, 23:26
ROTFL!! :rotfl:
ti arrabbi per così poco? guarda che si è visto ben di peggio!! :D
dai un'occhiata ai post dell'utente $te :asd:
una volta l'ho pure cazziato :asd: :asd:
Parli tu che sei il primo che quando uno scrive "xkè" lo cazzia ... :asd:
ragazzi sapete se è corretto scrivere una cosa del genere:
int *prova:7;
cioè, se uso il bitfield su un puntatore ad intero mi ritrovo un puntatore di 7 bit ad un intero oppure un puntatore ad un intero di 7 bit?
nein
Bit fields do not have addresses—you can't have pointers to them or arrays of them.
Ziosilvio
25-01-2008, 00:40
chi sarebbe Cthulhu? :confused:
http://it.wikipedia.org/wiki/Cthulhu
http://nonciclopedia.wikia.com/wiki/Cthulhu
http://www.youtube.com/watch?v=WN4XKHusVbo
trallallero
25-01-2008, 07:53
ragazzi sapete se è corretto scrivere una cosa del genere:
int *prova:7;
cioè, se uso il bitfield su un puntatore ad intero mi ritrovo un puntatore di 7 bit ad un intero oppure un puntatore ad un intero di 7 bit?
:eek:
Certo che la fantasia non ti manca :asd:
puoi solo fare strutture a bit con campi unsigned int (che io sappia)
struct pippo
{
unsigned int x : 1;
unsigned int y : 3;
...
};
:eek:
Certo che la fantasia non ti manca :asd:
puoi solo fare strutture a bit con campi unsigned int (che io sappia)
struct pippo
{
unsigned int x : 1;
unsigned int y : 3;
...
};
Vi giuro non conoscevo questa cosa :eek: Quando dico che non si finisce mai di imparare poi la gente non ci crede :D
Che fa ?
trallallero
25-01-2008, 08:55
Vi giuro non conoscevo questa cosa :eek: Quando dico che non si finisce mai di imparare poi la gente non ci crede :D
Che fa ?
in pratica setti quanti bit vuoi per ogni variabie.
Se metti : 1 hai un bit, quindi avrai una variabile solo booleana perchè potra
contenere o 1 o 0.
Con 2 bit avrai 4 valori e così via.
è utile per risparmiare memoria ;)
EDIT: dimenticavo, ovviamente la struttura creata non potrà essere di 1 bit, 3 bits o 3 bytes.
Sarà sempre allineata in qualche modo
ho spiegato una cosa a Cionci !!! :yeah:
trallallero
25-01-2008, 09:03
E come accedi ai bit ?
semplicemente usando la struttura.campo.
struct
{
unsigned int x : 1;
unsigned int y : 3;
...
} pippo;
pippo.x = 0;
pippo.x = 1;
pippo.y = 0;
pippo.y = 1;
pippo.y = 2;
pippo.y = 3;
ma non so cosa succede se provi ad assegnare un numero troppo alto ad una variabile di questo tipo per es.:
pippo.x = 2;
trallallero
25-01-2008, 09:07
io avevo usato questo sistema in un progetto di telecomunicazioni ed era utile per
gestire il messaggio tra client/server.
Però, se non ricordo male, ho dovuto mettere il #pragma no member_aligment ovunque
io avevo usato questo sistema in un progetto di telecomunicazioni ed era utile per
gestire il messaggio tra client/server.
Però, se non ricordo male, ho dovuto mettere il #pragma no member_aligment ovunque
si bisogna stare attenti al packing, altrimenti non sai bene cosa può succedere :D
trallallero
25-01-2008, 09:47
si bisogna stare attenti al packing, altrimenti non sai bene cosa può succedere :D
mamma mia, mi ricordo il porting dal sistema Tandem a Unix/Oracle, swappare tutto e, soprattutto, controllare tutte le strutture per l'allineamento :muro:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.