PDA

Visualizza la versione completa : [C]Errore free abbastanza semplice


davidinho
06-07-2013, 15:24
Ho una funzione e dovrei capire il motivo di un dato errore ma non ne riesco a venire a capo, vi posto il codice(si tratta di codice C)

void f2(void) {
char *a, *b, *c;

a = "ciao";
if (!(b = malloc(sizeof(char) * 10))) {
return;
}
strcpy(b, "prova1");

c = b;
b = a;
a = c;
c = NULL;

printf("a = '%s'\nb = '%s'\n", a, b);

free(b);
}

So per certo che l'errore avviene nel free(b) a causa dello scambio fra a e b, quello che non capisco perch? mi limito a scambiare le stringhe a cui puntano, nel momento in cui vado a liberare la memoria puntata da b per quale motivo dovrebbe dare errore?

oregon
06-07-2013, 16:44
L'unico puntatore su cui puoi fare il free quello della malloc (ovvero quello che hai memorizzato in b).

Quando scrivi

b=a;

il valore del puntatore b diventa un altro, ovvero diventa il puntatore a "ciao" (fra l'altro un puntatore ad una stringa costante) e quindi non puoi usare la free.

Quello che forse non ti chiaro che la cosa importante non il nome del puntatore (a b o c) ma il suo valore.

davidinho
06-07-2013, 17:13
no, quello che non sapevo che non si pu usare il free su zone di memoria non create con malloc

grazie mille, sei stato chiarissimo :)

oregon
06-07-2013, 17:49
Originariamente inviato da davidinho
no, quello che non sapevo che non si pu usare il free su zone di memoria non create con malloc

Beh, non ha senso che il programma liberi memoria non allocata.

malloc/free vanno sempre in coppia ...



grazie mille

Di nulla

Loading