Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kraiked en 20 Febrero 2016, 18:32 pm



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.
Código:
#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.

Código:
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.
Código:
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
Código:
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
Código:
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:
Código:
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:

Código:
 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.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 20
  4.  
  5. typedef struct _Mazmorra { //Este struct tiene un tamaño de 2*int + 1*char
  6.    int x;
  7.    int y;
  8.    char c;
  9.  
  10. }Mazmorra;
  11.  
  12. typedef struct _Punto{ //Este struct tiene un tamaño de 4*Mazmorra
  13.    Mazmorra *P_final;
  14.    Mazmorra *P_principio;
  15.    Mazmorra *p_tamanyo;
  16.    Mazmorra *tamanyo_mazmorra[MAX][MAX];
  17. }Punto;
  18.  
  19. Punto* inicializar_mazmorra(){
  20.  
  21.    Punto *punto;
  22.    int x,y;
  23.  
  24.   punto=(Punto*)malloc(sizeof(Punto)); //Se crea espacio para un struct _Punto
  25.   if(punto==NULL){
  26.       printf ("error al reservar memoria");
  27.   }
  28.  
  29.   punto->P_final = (Mazmorra *) malloc(sizeof(Mazmorra)); //Se crea espacio para un struct Mazmorra
  30.   if(punto->P_final ==NULL){
  31.       printf ("error al reservar memoria");
  32.   }
  33.   punto->P_final=NULL;
  34.  
  35.   punto->P_principio = (Mazmorra *) malloc(sizeof(Mazmorra)); //Se crea espacio para un struct Mazmorra
  36.   if(punto->P_principio ==NULL){
  37.       printf ("error al reservar memoria");
  38.   }
  39.   punto->P_principio=NULL;
  40.  
  41.   punto->p_tamanyo = (Mazmorra *) malloc(sizeof(Mazmorra)); //Se crea espacio para un struct Mazmorra
  42.   if(punto->p_tamanyo ==NULL){
  43.       printf ("error al reservar memoria");
  44.   }
  45.   punto->p_tamanyo=NULL;
  46.  
  47.   for(x=0;x<MAX;x++){
  48.       for(y=0;y<MAX;y++){
  49.          punto->tamanyo_mazmorra[x][y] = (Mazmorra *) malloc(sizeof(Mazmorra)); //Se crea espacio para un struct Mazmorra
  50.             if(punto->tamanyo_mazmorra[x][y] ==NULL){
  51.       printf ("error al reservar memoria");
  52.   }
  53.            punto->tamanyo_mazmorra[x][y]=NULL;
  54.       }
  55.   }
  56.  
  57.   return punto;
  58. }
  59.  
  60. void Liberarmemoria(Punto *punto) {
  61.  
  62.    int x,y;
  63.  
  64.    free(punto->P_final);
  65.    free(punto->P_principio);
  66.    free(punto->p_tamanyo);
  67.       for(x=0;x<MAX;x++){
  68.       for(y=0;y<MAX;y++){
  69.            free(punto->tamanyo_mazmorra[x][y]);
  70.       }
  71.   }
  72.  
  73. }
  74.  
  75. int main(){
  76.    FILE *archivo;
  77.    Punto *punto;
  78.    int x;    
  79.  
  80.    punto = inicializar_mazmorra();
  81.  
  82.    punto->tamanyo_mazmorra[1][1]->x = 5;
  83.    archivo = fopen("prueba.dat","r");
  84.    if(archivo==NULL){
  85.        printf ("error");
  86.    }
  87.  
  88.    printf ("%c",punto->tamanyo_mazmorra[1][1]->x);
  89.  
  90.    //x = leer_archivo_mazmorra(archivo,punto);
  91.    Liberarmemoria(punto);
  92.    fclose(archivo);
  93.  
  94.  
  95. }
  96.