es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué dice “free” que mi puntero es inválido?

mientras(n >= 0);
    node * punto = malloc(sizeof(node));
    punto = crear(numero, n);

    //mostrar(punto);

    //liberar memoria
    mientras(punto != NULL)
    {
        node *tmp = punto->siguiente;
        free(punto);
        punto = tmp;
    }

}

node * crear(int datos[], int longitud)
{
    node * cabeza_lista;
    node * lista;
    for (int i = 0; i < longitud; i++)
    {
        if(i == 0)
        {
            cabeza_lista = malloc(sizeof(node));
            lista = malloc(sizeof(node));
            cabeza_lista->valor = datos[0];
            cabeza_lista->siguiente = lista;
        }
        else
        {
            lista->valor = datos[i];
            lista->siguiente = malloc(sizeof(node));
            lista->siguiente = NULL;
        }
    }
    return cabeza_lista;
}

Este código está devolviendo un error que es: – free (): puntero no válido
Abortado | ¿Por qué mi código no libera la memoria que he asignado? ¿Es porque he asignado eso en una función diferente?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible que el código no esté liberando la memoria porque la función create está asignando memoria para los nodos de la lista enlazada, pero la función free se llama en la función principal después de crear la lista enlazada. Esto significa que la memoria asignada por la función create podría no ser liberada adecuadamente por la función free.

    Para solucionar esto, debes asegurarte de que la memoria se asigna y libera correctamente en la función create misma. Una manera de hacer esto es asignar memoria para cada nuevo nodo usando malloc y liberar la memoria en la misma función. Aquí tienes una versión actualizada de la función create que debería funcionar correctamente:

    node * create(int datos[], int longitud)
    {
        node * cabeza_lista = NULL;
        node * lista = NULL;
        for (int i = 0; i < longitud; i++)
        {
            node * nuevo_nodo = malloc(sizeof(node));
            if (nuevo_nodo == NULL) {
                fprintf(stderr, "ERROR: No se pudo asignar memoria\n");
                exit(EXIT_FAILURE);
            }
            nuevo_nodo->valor = datos[i];
            nuevo_nodo->siguiente = NULL;
            if (i == 0)
            {
                lista = nuevo_nodo;
                cabeza_lista = lista;
            }
            else
            {
                lista->siguiente = nuevo_nodo;
                lista = lista->siguiente;
            }
        }
        return cabeza_lista;
    }
    

    En esta versión actualizada, se asigna un nuevo nodo en cada iteración del bucle, y su memoria se libera antes de que la función retorne. Además, se realiza una verificación de errores para asegurarse de que malloc no devuelva un puntero NULL.

Comments are closed.