PDA

View Full Version : allocazione dinamica della memoria in C


antimon
12-05-2007, 11:57
ciao, ho un problema con la memoria dinamica: come faccio a liberare la memoria allocata con malloc all'interno di questa funzione???

int *pioggia_asciutto ()
{
int i, j;
int cont=0;
int k=1;
for (i=0;i<X;++i) if(strcmp(mat[i][A],"asciutto ")==0 && strcmp(mat[i][B],"pioggia ")==0) cont++;
int *vett=(int *)malloc(size_t(cont));
vett[0]=cont;
for (i=0;i<X;++i) {
if(strcmp(mat[i][A],"asciutto ")==0 && strcmp(mat[i][B],"pioggia ")==0) {
vett[k]=i;
k++;
}
}
return (vett);
}

è sufficiente inserire una free nel main che agisca sul puntatore restituito della funzione??? grazieee

-fidel-
12-05-2007, 12:34
ciao, ho un problema con la memoria dinamica: come faccio a liberare la memoria allocata con malloc all'interno di questa funzione???

int *pioggia_asciutto ()
{
int i, j;
int cont=0;
int k=1;
for (i=0;i<X;++i) if(strcmp(mat[i][A],"asciutto ")==0 && strcmp(mat[i][B],"pioggia ")==0) cont++;
int *vett=(int *)malloc(size_t(cont));
vett[0]=cont;
for (i=0;i<X;++i) {
if(strcmp(mat[i][A],"asciutto ")==0 && strcmp(mat[i][B],"pioggia ")==0) {
vett[k]=i;
k++;
}
}
return (vett);
}

è sufficiente inserire una free nel main che agisca sul puntatore restituito della funzione??? grazieee

stai facendo un errore piuttosto serio. Vuoi allocare un vettore di interi, ed il vettore deve contenere "cont" elementi, giusto?
In questo caso, devi fare:

int *vett=(int *)malloc(cont*sizeof(int));

come fai tu non allochi sufficiente memoria, e il rsultato nell'accesso a "vett" diventa potenzialmente indefinito.

Ovviamente liberi il tutto con

free(vett);

antimon
12-05-2007, 12:56
grazie per la correzione su malloc :p

-fidel-
12-05-2007, 15:21
grazie per la correzione su malloc :p

Figurati ;) Aggiungo una cosa: se invece vai ad allocare un vettore di puntatori (classico caso, un vettore di stringhe), del tipo:


char *vett[] = (char**)malloc(vett_size*sizeof(char*)));


che poi vai a riempire con voci del tipo:


for (i = 0; i < vett_size; i++)
vett[i] = (char*)malloc(string_lenght*sizeof(char));
/*
Per ottimizare le risorse, string_length e' spesso
diverso per ogni stringa.
*/


devi deallocare prima le singole stringhe, poi tutto il vettore:


for (i = 0; i < vett_size; i++)
free(vett[i]);
free(vett[]);


Ah, ho usato '[]' al posto di un secondo '*' giusto per far capire che si tratta di un array di puntatori (per maggiore chiarezza nella lettura del codice).

antimon
13-05-2007, 09:52
Nello stesso programma ho utilizzato malloc anche per una stringa:

char *nuova=(char *)malloc(size_t(strlen(a)+1));

però, seguendo lo stesso ragionamento è più corretto:

char *nuova=(char *)malloc((strlen(a)+1)*sizeof(char));

????:)

-fidel-
13-05-2007, 10:57
Nello stesso programma ho utilizzato malloc anche per una stringa:

char *nuova=(char *)malloc(size_t(strlen(a)+1));

però, seguendo lo stesso ragionamento è più corretto:

char *nuova=(char *)malloc((strlen(a)+1)*sizeof(char));

????:)

Esatto. In questo caso, usando il tipo "char" che ha lunghezza 1 byte (ma non è neanche detto, su tutti i sistemi) sarebbe la stessa cosa (visto che moltiplichi per 1), ma se usassi un int? Poi, come accennato, Non è detto a priori che un tipo di variabile abbia la stessa dimensione su tutti i sistemi/compilatori. Inoltre, se usassi una stringa w_char? E se allocassi un puntatore (sizeof(char*)) come nell'esempio precedente (vettore di stringhe)? Avrei un ritorno di 4 sui sistemi a 32 bit, 8 sui sistemi a 64 bit. Se omettessi sizeof(), nel 99% dei casi allochi una quantità di memoria insufficiente, con conseguenze imprevedibili (classico buffer overflow, o meglio heap overflow in questo caso, tra l'altro sfruttabili per attacchi informatici, oltre a non far funzionare correttamente il tuo programma - causare page/segmentation fault, ecc. ecc.).

Insomma, sempre usare sizeof(var_type).