[SOLUCIONADO ]Structs Dinamicas

Iniciado por Xenomorfo77, 6 Mayo 2014, 20:14 PM

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

Xenomorfo77

Código (cpp) [Seleccionar]

#include <stdio.h>

typedef struct Vagon{
   int numero;
   int peso;
   char *carga;
}vagon;

typedef struct Tren{
vagon *v;
}tren;


int main(){

   int nvagones=10;

   tren *p=(tren *)malloc(sizeof(tren));

   p->v =(vagon *)malloc(nvagones*sizeof(vagon));    

   return 0;
}


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 (cpp) [Seleccionar]

#include <stdio.h>

typedef struct Vagon{
    int numero;
    int peso;
    char *carga;
}vagon;

typedef struct Tren{
vagon *v;
}tren;

char cargas[4][25]={"MADERA","PAN","HIERRO","ALIMENTOS"};

int main(){
    srand(time(NULL));

    int nvagones=10;
    int i;

    tren *p=(tren *)malloc(sizeof(tren));

    p->v =(vagon *)malloc(nvagones*sizeof(vagon));

    for(i=0;i<nvagones;i++){
        p->v[i].numero=i+1;
        p->v[i].peso = 500+(rand()%1500);
        p->v[i].carga =cargas[rand()%4];
    }

    for(i=0;i<nvagones;i++){
        printf("Numero: %d\n",p->v[i].numero);
        printf("\tPeso: %dKg",p->v[i].peso);
        printf("\tCarga: %s\n",p->v[i].carga);
    }


    return 0;
}

Eternal Idol

p->v[2].numero=1;

Ya estas desreferenciando el puntero al acceder al tercer elemento del array.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Xenomorfo77

Cita de: 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.

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

¿Correcto?

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Blaster

Solo agregar una cosa mas, no debes olvidar de liberar la memoria despues
de utilizarla

Código (cpp) [Seleccionar]
free(p);
free(p->v);


Saludos

Xenomorfo77

Cita de: 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 (cpp) [Seleccionar]
free(p);
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);

Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón