Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: petita en 20 Julio 2013, 03:03 am



Título: [Resuelto] Memoria dinamica con Estructuras
Publicado por: petita en 20 Julio 2013, 03:03 am
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;}


Título: Re: [Pregunta] Memoria dinamica con Estructuras
Publicado por: rir3760 en 20 Julio 2013, 07:40 am
Mi 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 *".

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??
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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct Dato {
  6.   char *nombre;
  7.   int dni;
  8. } Alumno;
  9.  
  10. Alumno *NuevoAlumno(void);
  11.  
  12. int main(void)
  13. {
  14.   Alumno *Clase[2];
  15.  
  16.   Clase[0] = NuevoAlumno();
  17.   Clase[1] = NuevoAlumno();
  18.  
  19.   /* Algun proceso ... */
  20.  
  21.   /* Liberacion de memoria */
  22.   free(Clase[0]->nombre);
  23.   free(Clase[0]);
  24.   free(Clase[1]->nombre);
  25.   free(Clase[1]);
  26.  
  27.   return 0;
  28. }
  29.  
  30. Alumno *NuevoAlumno(void)
  31. {
  32.   Alumno *a = malloc(sizeof *a);
  33.   char aux[50];
  34.  
  35.   printf("Ingrese el nombre del alumno: ");
  36.   fflush(stdout);
  37.   scanf("%49s", aux);
  38.   a->nombre = malloc(strlen(aux) + 1);
  39.   strcpy(a->nombre, aux);
  40.  
  41.   printf("Ingrese el numero de dni del alumno: ");
  42.   fflush(stdout);
  43.   scanf("%d", &a->dni);
  44.  
  45.   return a;
  46. }

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

Un saludo


Título: Re: [Pregunta] Memoria dinamica con Estructuras
Publicado por: petita en 20 Julio 2013, 14:35 pm

   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
  


Título: Re: [Pregunta] Memoria dinamica con Estructuras
Publicado por: rir3760 en 20 Julio 2013, 18:35 pm
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?
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:
Código
  1. int main(void)
  2. {
  3.   Alumno **Clase;
  4.   int num_elem = 123; /* Solo un ejemplo */
  5.   int i;
  6.  
  7.   Clase = malloc(num_elem * sizeof *Clase);
  8.  
  9.   Clase[0] = NuevoAlumno();
  10.   Clase[1] = NuevoAlumno();
  11.   /* ... */
  12.  
  13.   /* Algun proceso ... */
  14.  
  15.   /* Liberacion de memoria */
  16.   for (i = 0; i < num_elem; i++){
  17.      free(Clase[i]->nombre);
  18.      free(Clase[i]);
  19.   }
  20.   free(Clase);
  21.  
  22.   return 0;
  23. }

Un saludo


Título: Re: [Pregunta] Memoria dinamica con Estructuras
Publicado por: petita en 20 Julio 2013, 19:34 pm
Buenísimo, eso es lo que intentaba hacer! Muchas gracias por tu tiempo!!
Saludos