Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: LadyWin en 30 Julio 2021, 23:01 pm



Título: Lista Enlazada - asignar memoria
Publicado por: LadyWin en 30 Julio 2021, 23:01 pm
Hola gente!, estaba leyendo un codigo en internet y me surgieron algunas dudas:

Código
  1. typedef struct ElementoLista
  2. {
  3.  char *dato;
  4.  struct ElementoLista *siguiente;
  5. } Elemento;
  6.  
  7. typedef struct ListaIdentificar
  8. {
  9.  Elemento *inicio;
  10.  Elemento *fin;
  11.  int tamanio;
  12. } Lista;

Código
  1. int ins_en_lista_vacia (Lista * lista, char *dato) {
  2.    Elemento *nuevo_elemento;
  3.    if ((nuevo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL)
  4.    {
  5.        return -1;
  6.    }
  7.    if ((nuevo_elemento->dato = (char *) malloc (50 * sizeof (char))) == NULL)
  8.    {
  9.        return -1;
  10.    }
  11.    strcpy (nuevo_elemento->dato, dato);
  12.    nuevo_elemento->siguiente = NULL;
  13.    lista ->inicio = nuevo_elemento;
  14.    lista ->fin = nuevo_elemento;
  15.    lista ->tamanio++;
  16.    return 0;
  17. }

Es una funcion para insertar un elemento a una lista vacia, en la condicion 'if' primero le asigna espacio en la memoria a 'nuevo_elemento' y despues compara ese resultado con NULL, que significa eso? Generalmente asigno NULL a los punteros que todavia no apuntan a un elemento, ademas que en esa funcion le asigno memoria a 'nuevo_elemento' y despues a 'nuevo_elemento->dato', no seria suficiente con asignar memoria solo a 'nuevo_elemento->dato'?

Código
  1. int main (void){
  2.    char eleccion;
  3.    char *nom;
  4.    Lista *lista;
  5.    Elemento *actual;  
  6.    if ((lista = (Lista *) malloc (sizeof (Lista))) == NULL) return -1;
  7.    if ((nom = (char *) malloc (50)) == NULL) return -1;

Mi otra duda es que pude notar que asigno memoria a una estructura entera, 'Lista', no a una variable de tipo 'Elemento' como hizo en la funcion de insercion, por que no hacer lo mismo con todas las estructuras? No como hizo en la funcion 'ins_en_lista_vacia' que asigno en dos situaciones. Espero no haber hecho muchas preguntas, realmente me tiene confundida este tema de asignar memoria y no encuentro un medio para poder entenderlo mejor. Desde ya muchas gracias.



Título: Re: Lista Enlazada - asignar memoria
Publicado por: ivancea96 en 31 Julio 2021, 12:10 pm
Buenas,

Por un lado, lo de NULL. malloc devuelve NULL si no puede conseguir ese espacio de memoria. Comprobar que malloc no devuelva NULl es una técnica bastante "defensiva" ante errores por memoria (que no haya memoria, que se intente reservar una cantidad contigua de memoria demasiado grande...). En mi opinión, no es común, salvo que sea un código profesional. personalmente te diría que en tu código, de momento, no hagas esas comprobaciones. Son casos muy específicos. Habrá quien opine diferente anyway.

Sobre lo de malloc en Lista, no sé si te sigo bien: Para cualquier estructura que se quiera tener en memoria (en el heap), hay que reservarle memoria. La lista enlazada está compuesta de 2 tipos de estructuras: La lista en sí (lista), y sus elementos (Elemento). Cada vez que se crea una de estas estructuras, hay que reservar con malloc. En caso de Lista, se hará 1 vez por lista que se cree. En casod e Elemento, 1 vez por cada Elemento (Lo que se ve en ins_en_lista_vacia). De hecho, en ins_en_lista_vacia reserva 2 veces: 1 para el Elemento, y otra para el dato que guarda dentro (el char*).

No sé si esto responde bien a tu pegunta 👀