Estructuras y reservar memoria

Iniciado por kraiked, 20 Febrero 2016, 18:32 PM

0 Miembros y 1 Visitante están viendo este tema.

kraiked

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  :)

Eternal Idol

Trata de depurar tu programa; estas accediendo y liberando punteros nulos, tenes que asignarle memoria dinamica a esos punteros.
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

kraiked

#2
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

Eternal Idol

#3
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 ...
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

lfgmespino

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_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]);
       }
   }

}

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);
    Liberarmemoria(punto);
    fclose(archivo);

   
}