elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Lista Enlazada - asignar memoria
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Lista Enlazada - asignar memoria  (Leído 2,649 veces)
LadyWin

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Lista Enlazada - asignar memoria
« 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.



En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Lista Enlazada - asignar memoria
« Respuesta #1 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 👀


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con lista enlazada
Java
netca 2 3,166 Último mensaje 20 Abril 2012, 16:11 pm
por adwind
Ayuda Lista Enlazada
Programación C/C++
robluis 5 5,426 Último mensaje 9 Mayo 2012, 03:49 am
por botella
Ayuda con lista enlazada
Programación C/C++
agrichi 1 1,645 Último mensaje 24 Diciembre 2017, 12:22 pm
por do-while
Lista Enlazada
Java
padiuwu 1 1,808 Último mensaje 1 Abril 2019, 18:25 pm
por spcruzaley
Lista Enlazada
Java
padiuwu 1 1,830 Último mensaje 20 Marzo 2019, 12:44 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines