Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Xenomorfo77 en 6 Mayo 2014, 20:14 pm



Título: [SOLUCIONADO ]Structs Dinamicas
Publicado por: Xenomorfo77 en 6 Mayo 2014, 20:14 pm
Código
  1. #include <stdio.h>
  2.  
  3. typedef struct Vagon{
  4.    int numero;
  5.    int peso;
  6.    char *carga;
  7. }vagon;
  8.  
  9. typedef struct Tren{
  10. vagon *v;
  11. }tren;
  12.  
  13.  
  14. int main(){
  15.  
  16.    int nvagones=10;
  17.  
  18.    tren *p=(tren *)malloc(sizeof(tren));
  19.  
  20.    p->v =(vagon *)malloc(nvagones*sizeof(vagon));    
  21.  
  22.    return 0;
  23. }
  24.  

Estoy aprendiendo punteros y este ejemplo trata de hacer trenes con muchos vagones. En el ejemplo con 1 solo tren luego reservo memoria para 10 vagones. Lo que pasa es que no se acceder luego a cada vagon porque p->v[2]->numero=1; por ejemplo no funciona y no entiendo porque. ¿Alguien me explica?

Dejo el code de ejemplo por si a alguien le sirve de algo:

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct Vagon{
  4.    int numero;
  5.    int peso;
  6.    char *carga;
  7. }vagon;
  8.  
  9. typedef struct Tren{
  10. vagon *v;
  11. }tren;
  12.  
  13. char cargas[4][25]={"MADERA","PAN","HIERRO","ALIMENTOS"};
  14.  
  15. int main(){
  16.    srand(time(NULL));
  17.  
  18.    int nvagones=10;
  19.    int i;
  20.  
  21.    tren *p=(tren *)malloc(sizeof(tren));
  22.  
  23.    p->v =(vagon *)malloc(nvagones*sizeof(vagon));
  24.  
  25.    for(i=0;i<nvagones;i++){
  26.        p->v[i].numero=i+1;
  27.        p->v[i].peso = 500+(rand()%1500);
  28.        p->v[i].carga =cargas[rand()%4];
  29.    }
  30.  
  31.    for(i=0;i<nvagones;i++){
  32.        printf("Numero: %d\n",p->v[i].numero);
  33.        printf("\tPeso: %dKg",p->v[i].peso);
  34.        printf("\tCarga: %s\n",p->v[i].carga);
  35.    }
  36.  
  37.  
  38.    return 0;
  39. }
  40.  


Título: Re: Structs Dinamicas
Publicado por: Eternal Idol en 6 Mayo 2014, 21:19 pm
p->v[2].numero=1;

Ya estas desreferenciando el puntero al acceder al tercer elemento del array.


Título: Re: Structs Dinamicas
Publicado por: Xenomorfo77 en 6 Mayo 2014, 21:25 pm
p->v[2].numero=1;

Ya estas desreferenciando el puntero al acceder al tercer elemento del array.

Ya me he dado cuenta estaba intentando hacer p->v[]-> cuando es p->v[].

¿Correcto?


Título: Re: Structs Dinamicas
Publicado por: Eternal Idol en 6 Mayo 2014, 21:31 pm
Si, es correcto.


Título: Re: [SOLUCIONADO ]Structs Dinamicas
Publicado por: Blaster en 6 Mayo 2014, 21:54 pm
Solo agregar una cosa mas, no debes olvidar de liberar la memoria despues
de utilizarla

Código
  1. free(p);
  2. free(p->v);

Saludos


Título: Re: [SOLUCIONADO ]Structs Dinamicas
Publicado por: Xenomorfo77 en 7 Mayo 2014, 01:00 am
Solo agregar una cosa mas, no debes olvidar de liberar la memoria despues
de utilizarla

Código
  1. free(p);
  2. free(p->v);

Saludos

Muy cierto gracias. Y una cosa ¿El órden de liberar es ese? O sería free(p->v) y despues free(p);


Título: Re: [SOLUCIONADO ]Structs Dinamicas
Publicado por: Eternal Idol en 7 Mayo 2014, 01:18 am
El que vos decis Xenomorfo77, una vez que liberas p no podes trabajar mas con el, es memoria invalida y desreferenciar ese puntero un error logico.