[Resuelto] Memoria dinamica con Estructuras

Iniciado por petita, 20 Julio 2013, 03:03 AM

0 Miembros y 2 Visitantes están viendo este tema.

petita

Mi duda es la siguiente... En  el código de abajo me tira errores en:
Clase[0]=NuevoAlumno();
Clase[1]=NuevoAlumno();

Está mal reservar memoria para el vector clase,  luego crear las estructuras necessarias y guardar las direcciones de memoria de dichas estructuras en la memoria reservada??

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Dato {
      int dni;
      char *nombre;
   }Alumno;

Alumno* NuevoAlumno(){
   Alumno *a;
   char aux[50];
   a=(Alumno*)malloc(sizeof(Alumno));
   printf("Ingrese el nombre del alumno");
   scanf("%s",&aux);
   a->nombre=(char*)malloc(strlen(aux)*sizeof(char));
   strcpy(a->nombre,aux);
   printf("Ingrese el numero de dni del alumno");
   scanf("%i",&(a->dni));
   
   return a;
}
   

int main(){
   
int x=0;   
Alumno *Clase, *pepe,*papa;
Clase=(Alumno*)malloc(10*sizeof(Alumno));


Clase[0]=NuevoAlumno();

Clase[1]=NuevoAlumno();

return 0;}

rir3760

Cita de: petita en 20 Julio 2013, 03:03 AMMi duda es la siguiente... En  el código de abajo me tira errores en:
Clase[0]=NuevoAlumno();
Clase[1]=NuevoAlumno();
Ello se debe a que los tipos son diferentes: "Clase[0]" y "Clase[1]" son de tipo "Alumno" mientras que la función "NuevoAlumno" retorna un puntero de tipo "Alumno *".

Cita de: petita en 20 Julio 2013, 03:03 AMEstá mal reservar memoria para el vector clase,  luego crear las estructuras necessarias y guardar las direcciones de memoria de dichas estructuras en la memoria reservada??
El problema es que no estas haciendo eso en el programa, el error principal en este es reservar en dos ocasiones la memoria para las estructuras: primero en la función principal y después en la función "NuevoAlumno".

Para realizar lo que mencionas se debe utilizar un array de punteros a estructuras en la función main almacenando en este las direcciones que retorna la función "NuevoAlumno". De esta forma:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Dato {
   char *nombre;
   int dni;
} Alumno;

Alumno *NuevoAlumno(void);

int main(void)
{
   Alumno *Clase[2];
   
   Clase[0] = NuevoAlumno();
   Clase[1] = NuevoAlumno();
   
   /* Algun proceso ... */
   
   /* Liberacion de memoria */
   free(Clase[0]->nombre);
   free(Clase[0]);
   free(Clase[1]->nombre);
   free(Clase[1]);
   
   return 0;
}

Alumno *NuevoAlumno(void)
{
   Alumno *a = malloc(sizeof *a);
   char aux[50];
   
   printf("Ingrese el nombre del alumno: ");
   fflush(stdout);
   scanf("%49s", aux);
   a->nombre = malloc(strlen(aux) + 1);
   strcpy(a->nombre, aux);
   
   printf("Ingrese el numero de dni del alumno: ");
   fflush(stdout);
   scanf("%d", &a->dni);
   
   return a;
}


Falta agregar la verificación de errores en la función "NuevoAlumno" de las llamadas a malloc, eso te toca a ti.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

petita

#2
Cita de: rir3760 en 20 Julio 2013, 07:40 AM

  Alumno *Clase[2];



Gracias por la respuesta rir3760. De todas formas lo que quiero hacer es que el vector Clase sea de "n" componentes, de esta forma solo puedo crear una cantidad fija de alumnos. ¿Es posible hacer eso?¿Hacer que el vector clase sea dinámico?
Saludos
 

rir3760

Cita de: petita en 20 Julio 2013, 14:35 PMlo que quiero hacer es que el vector Clase sea de "n" componentes, de esta forma solo puedo crear una cantidad fija de alumnos. ¿Es posible hacer eso?¿Hacer que el vector clase sea dinámico?
Si, es posible. Solo hay que cambiar la aproximación en la función principal, en lugar de utilizar un array se utiliza un puntero para reservar un bloque de memoria (la tabla de direcciones).

La función main con los cambios:
int main(void)
{
   Alumno **Clase;
   int num_elem = 123; /* Solo un ejemplo */
   int i;
   
   Clase = malloc(num_elem * sizeof *Clase);
   
   Clase[0] = NuevoAlumno();
   Clase[1] = NuevoAlumno();
   /* ... */
   
   /* Algun proceso ... */
   
   /* Liberacion de memoria */
   for (i = 0; i < num_elem; i++){
      free(Clase[i]->nombre);
      free(Clase[i]);
   }
   free(Clase);

   return 0;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

petita

Buenísimo, eso es lo que intentaba hacer! Muchas gracias por tu tiempo!!
Saludos