no me libera memoria en listas dinamicas

takyo
14 de Noviembre del 2005
tengo esta lista

struct est_ficha
{
int cod_asig[5];
float nota_asig;
struct est_ficha *sig;
struct est_ficha *ant;
};
typedef struct est_ficha ficha;

main()
ficha *lista.*aux;
lista = inicializar(lista);
lista = crear()//me krea un nodo
aux = lista;
free(aux);//HE AKI DILEMA

pues eso
kuando llega a free no me borra la memoria reservada
simplemente no hace nada
zalguien me dice ke falla aki?
y kuando kompilo paso por paso y me llega a free(aux) me da un error, pero kuando lo kompilo de golpe no me de ningun error

espero ke me resolvais esta duda pues me es indispensable para seguir kon mi practika

gracias

chuidiang
14 de Noviembre del 2005
Hola:

free() libera la memoria, pero no hace que el puntero apunte a NULL.

Habría que ver que hace la función crear(). Si crea bien la memoria y la devuelve, el free() debería funcionar bien y no dar ningún error.

Otro tema que veo raro es que a lista le asignas la salida de dos funciones: inicializar() y crear(). Además, pasas lista como parámetro a inicializar() y lista (valga la redundancia) está sin inicializar().

Salvo que la funcion inicialzar() devuelva NULL, la memoria que devuelve la pierdes sin liberarla, porque luego crear() se asigna a lista.

Echa un ojo en http://www.geocities.com/chuidiang/funciones/punteros.html a ver si te ayuda un poco con el tema de los free().

Se bueno.

takyo
14 de Noviembre del 2005
#include <stdio.h>/**************************************************************************/
#include <stdlib.h>/****************** MAIN *************************************************/


struct est_ficha
{
int cod_asig[5];
float nota_asig;
struct est_ficha *sig;
struct est_ficha *ant;
};


typedef struct est_ficha ficha; //ficha es un tipo de estructura "est_ficha"
//para ahorrarse eskribir "struct est_ficha ..."

void main()
{
ficha *lista, *aux;


lista = NULL;

lista = (ficha *) malloc (sizeof(lista));

lista->sig=NULL;
lista->nota_asig=1;

aux = (ficha *) malloc (sizeof(aux));

lista->ant = aux;
aux->sig=lista;
aux->nota_asig=2;
lista=aux;

aux = (ficha *) malloc (sizeof(aux));

lista->ant = aux;
aux->sig=lista;
aux->nota_asig=3;
lista=aux;

free(aux);
aux->nota_asig=10;//si se hubiera liberado esto daria error
}

aki teneis un ejemplo klarisimo de ke no me libera memoria
simplemente me pone las variables a 0

espero ke asi me podais aklarar esto

takyo
14 de Noviembre del 2005
la funcion inicializar lo uniko ke hace es devolver NULL
(me lo pedia el ejercicio)
y la otra funcion hace esto

ficha *nodo
nodo = (ficha *) malloc (sizeof(nodo));
scanf(\"%f\",&nota);
nodo->nota_asig=nota;
return(nodo)//devuelve la direkcion de nodo

el return hace ke me devuelva la direkcion de nodo y pasa a ser la direkcion de lista ademas la funcion insertar (no esta entera) hace ke nodo->sig = lista(NULL) y todo ese royo de apuntadores

gracias por el interes