Título: Estructuras y reservar memoria
Publicado por: kraiked en 20 Febrero 2016, 18:32 pm
Hola, espero no ser una molestia con los temas que abro cada poco tiempo. Bueno, la cosa es que he tengo dos estructuras, y cuando reservo memoria para una de ellas creo que lo hago mal. Aqui declaro las estructuras y defino MAX. #include <stdio.h> #include <stdlib.h> #define MAX 20
typedef struct _Mazmorra { int x; int y; char c; }Mazmorra;
typedef struct _Punto{ Mazmorra *P_final; Mazmorra *P_principio; Mazmorra *p_tamanyo; Mazmorra *tamanyo_mazmorra[MAX][MAX]; }Punto;
Aqui creo que reservo memoria, y pongo todo a NULL. Creo que aqui esta el fallo pero no se donde. Punto* inicializar_mazmorra(){ Punto *punto; int x,y; punto=(Punto*)malloc(sizeof(Punto)); if(punto==NULL){ printf ("error al reservar memoria"); }
punto->P_final=NULL; punto->P_principio=NULL; punto->p_tamanyo=NULL; for(x=0;x<MAX;x++){ for(y=0;y<MAX;y++){ punto->tamanyo_mazmorra[x][y]=NULL; } } } En esta libero la memoria, cuando compilo me da error al liberar la memoria, lo que me hace pensar que no reservo bien. Punto* Liberarmemoria(){ Punto *punto; int x,y; free(punto->P_final); free(punto->P_principio); free(punto->p_tamanyo); for(x=0;x<MAX;x++){ for(y=0;y<MAX;y++){ free(punto->tamanyo_mazmorra[x][y]); } }
}
Aqui el main, la cosa es que cuando complio e inteto escribir sobrela variable x en tamanyo_mazmorra me da eror y el programa finaliza int main(){ FILE *archivo; Punto *punto; int x; punto =inicializar_mazmorra(); punto->tamanyo_mazmorra[1][1]->x = 5; archivo = fopen("prueba.dat","r"); if(archivo==NULL){ printf ("error"); } printf ("%c",punto->tamanyo_mazmorra[1][1]->x); //x = leer_archivo_mazmorra(archivo,punto); punto = Liberarmemoria(); fclose(archivo);
}
Espero no ser de mucha molestia, un saludo :)
Título: Re: Estructuras y reservar memoria
Publicado por: Eternal Idol en 20 Febrero 2016, 20:28 pm
Trata de depurar tu programa; estas accediendo y liberando punteros nulos, tenes que asignarle memoria dinamica a esos punteros.
Título: Re: Estructuras y reservar memoria
Publicado por: kraiked en 21 Febrero 2016, 12:36 pm
Cuando depuro y llego a esta linea de codigo me da error punto->tamanyo_mazmorra[1][1]->x = 5; y se termina el programa, eso me hace pensar que no puede acceder a esa zona de memoria y por ello creo que el problema esta al reservar la memoria. Creo que reservo mal. El codigo que reserva la memoria es este: Punto *punto; punto=(Punto*)malloc(sizeof(Punto)); if(punto==NULL){ printf ("error al reservar memoria"); }
Y mi duda es que al tener en la estructura una matriz de 20x20 no tendria que hacer un bucle o algo? como cuando se libera la memoria
He estado probando y he hecho esto para reservar memoria y parece que funciona, da warnings pero me deja acceder a las zonas para escribir y leer, pero me da error al intentar liberar memoria, lo que he hecho es esto: punto->P_final=(Punto*)malloc(sizeof(Punto)); punto->P_principio=(Punto*)malloc(sizeof(Punto)); punto->p_tamanyo=(Punto*)malloc(sizeof(Punto)); for(x=0;x<MAX;x++){ for(y=0;y<MAX;y++){ punto->tamanyo_mazmorra[x][y]=(Punto*)malloc(sizeof(Punto)); } } Me podeis decir si eso que hice esta bien porfa
Título: Re: Estructuras y reservar memoria
Publicado por: Eternal Idol en 21 Febrero 2016, 14:23 pm
Esta mal en un detalle, los miembros de Punto son de tipo Mazmorra, no Punto.
Los warning son utiles, tenes que leerlos al menos, por ejemplo: warning C4700: uninitialized local variable 'punto' used
En la funcion Liberarmemoria usas punto, un puntero indefinido, es logico que falle. Lo logico seria que esa funcion recibiera como parametro el Punto a liberar ...
Título: Re: Estructuras y reservar memoria
Publicado por: lfgmespino en 25 Febrero 2016, 23:01 pm
Te falta crear espacio (reservar memoria) para los punteros a struct Mazmorra dentro de _Punto. Un saludo. #include <stdio.h> #include <stdlib.h> #define MAX 20 typedef struct _Mazmorra { //Este struct tiene un tamaño de 2*int + 1*char int x; int y; char c; }Mazmorra; typedef struct _Punto{ //Este struct tiene un tamaño de 4*Mazmorra Mazmorra *P_final; Mazmorra *P_principio; Mazmorra *p_tamanyo; Mazmorra *tamanyo_mazmorra[MAX][MAX]; }Punto; Punto* inicializar_mazmorra(){ Punto *punto; int x,y; punto =(Punto *)malloc(sizeof(Punto )); //Se crea espacio para un struct _Punto if(punto==NULL){ printf ("error al reservar memoria"); } punto ->P_final = (Mazmorra *) malloc(sizeof(Mazmorra )); //Se crea espacio para un struct Mazmorra if(punto->P_final ==NULL){ printf ("error al reservar memoria"); } punto->P_final=NULL; punto ->P_principio = (Mazmorra *) malloc(sizeof(Mazmorra )); //Se crea espacio para un struct Mazmorra if(punto->P_principio ==NULL){ printf ("error al reservar memoria"); } punto->P_principio=NULL; punto ->p_tamanyo = (Mazmorra *) malloc(sizeof(Mazmorra )); //Se crea espacio para un struct Mazmorra if(punto->p_tamanyo ==NULL){ printf ("error al reservar memoria"); } punto->p_tamanyo=NULL; for(x=0;x<MAX;x++){ for(y=0;y<MAX;y++){ punto ->tamanyo_mazmorra [x ][y ] = (Mazmorra *) malloc(sizeof(Mazmorra )); //Se crea espacio para un struct Mazmorra if(punto->tamanyo_mazmorra[x][y] ==NULL){ printf ("error al reservar memoria"); } punto->tamanyo_mazmorra[x][y]=NULL; } } return punto; } void Liberarmemoria(Punto *punto) { int x,y; free(punto ->P_principio ); for(x=0;x<MAX;x++){ for(y=0;y<MAX;y++){ free(punto ->tamanyo_mazmorra [x ][y ]); } } } int main(){ FILE *archivo; Punto *punto; int x; punto = inicializar_mazmorra(); punto->tamanyo_mazmorra[1][1]->x = 5; archivo = fopen("prueba.dat","r"); if(archivo==NULL){ } printf ("%c",punto ->tamanyo_mazmorra [1][1]->x ); //x = leer_archivo_mazmorra(archivo,punto); Liberarmemoria(punto); }
|