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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Resuelto] Memoria dinamica con Estructuras
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Resuelto] Memoria dinamica con Estructuras  (Leído 2,614 veces)
petita

Desconectado Desconectado

Mensajes: 3


Ver Perfil
[Resuelto] Memoria dinamica con Estructuras
« 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;}


« Última modificación: 21 Julio 2013, 01:33 am por petita » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Pregunta] Memoria dinamica con Estructuras
« Respuesta #1 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


En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [Pregunta] Memoria dinamica con Estructuras
« Respuesta #2 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
  
« Última modificación: 20 Julio 2013, 16:38 pm por petita » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Pregunta] Memoria dinamica con Estructuras
« Respuesta #3 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
En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [Pregunta] Memoria dinamica con Estructuras
« Respuesta #4 en: 20 Julio 2013, 19:34 pm »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Asignacion Dinamica Memoria
Programación C/C++
charmedever 5 3,410 Último mensaje 21 Octubre 2011, 05:25 am
por charmedever
Memoria dinámica
Programación C/C++
eleon 6 4,783 Último mensaje 24 Enero 2012, 22:17 pm
por Eternal Idol
Ayuda con matriz dinámica de estructuras
Programación C/C++
darklatios2006 4 2,762 Último mensaje 21 Marzo 2013, 19:58 pm
por amchacon
Estructuras y reservar memoria
Programación C/C++
kraiked 4 3,448 Último mensaje 25 Febrero 2016, 23:01 pm
por lfgmespino
¿Puedo crear el concepto de "clases" con estructuras y memoria dinamica en C?
Programación C/C++
fafafa01 1 1,675 Último mensaje 3 Septiembre 2017, 21:03 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines