Ver Mensaje Individual
  #4 (permalink)  
Antiguo 25/06/2015, 09:16
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 3 meses
Puntos: 204
Respuesta: Duda programación en C

Te estás haciendo un lío con los punteros:

Si haces:

Lista1 = malloc()

y después haces

Lista1 = CrearMiembro

¿qué sucede con la primera reserva de memoria? se pierde, dejando por el camino lo que se llaman fugas de memoria. El efecto de estas fugas de memoria es que la máquina cada vez va a tener menos memoria disponible, ya que no se libera, hasta que llega un punto en el que se le agota la memoria libre y algo acaba cascando.

Es decir, si llamas a CrearMiembro (que en tu primera versión no lo hacías hasta después de intentar acceder a los miembros de Lista1) no necesitas hacer malloc.

Además, en el main sigues teniendo punteros sin inicializar:
Código C:
Ver original
  1. char *Nombre;
  2.  
  3. // ...    
  4.  
  5. printf("Indique el nombre que quiere introducir: ");
  6. scanf("%s", &Nombre);
  7. printf("\n");

¿Dónde está la memoria reservada para almacenar la cadena de Nombre? En ningún sitio.

Puedes optar por calcular un tamaño lo suficientemente grande como para que entre cualquier nombre y evitar el uso de memoria dinámica:

Código C:
Ver original
  1. char Nombre[100];

Por otro lado, si analizamos la función CrearMiembro:

Código C:
Ver original
  1. miembro *CrearMiembro(miembro *Lista, double telefono, int anios, char *name)
  2. {
  3.     miembro *NuevoMiembro, *aux;
  4.     NuevoMiembro = (miembro *) malloc(sizeof(miembro));
  5.    
  6.     if(NuevoMiembro != NULL){
  7.         NuevoMiembro->edad = anios;
  8.         NuevoMiembro->telef = telefono;
  9.         NuevoMiembro->nombre = name; // <<--- 1
  10.         NuevoMiembro->sig = NULL;
  11.     }
  12.    
  13.     if (Lista == NULL){
  14.         Lista = NuevoMiembro;
  15.     }
  16.     else
  17.     {
  18.         aux = Lista;
  19.            
  20.         while(aux->sig != NULL){
  21.             aux = aux->sig;
  22.         }
  23.            
  24.         aux = NuevoMiembro; // <<--- 2
  25.     }
  26.    
  27.     return Lista;
  28. }

1. Las cadenas de texto no se pueden copiar así... o bien declaras nombre como un array de tamaño fijo o bien haces una reserva dinámica de memoria para que entre la cadena que quieres copiar y, a continuación, tienes que usar strcmp para copiar una cadena en otra. Si haces una copia de punteros tienes que ser consciente de que la dirección de memoria apuntada es compartida y tienes que manejarla con cuidado.

2. ¿Aquí no tendría que ser aux->sig = NuevoMiembro?

Y, bueno, ya puestos, lo mejor sería que empezases a trastear con el depurador de código. Es una herramienta imprescindible en este mundillo y es mejor aprender a usarla con programas pequeños.

Un saludo