elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Estructuras y reservar memoria
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Estructuras y reservar memoria  (Leído 3,788 veces)
kraiked

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Estructuras y reservar memoria
« 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  :)


« Última modificación: 20 Febrero 2016, 18:41 pm por kraiked » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Estructuras y reservar memoria
« Respuesta #1 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.


En línea

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

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Re: Estructuras y reservar memoria
« Respuesta #2 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
« Última modificación: 21 Febrero 2016, 14:26 pm por Eternal Idol » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Estructuras y reservar memoria
« Respuesta #3 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 ...
« Última modificación: 21 Febrero 2016, 14:27 pm por Eternal Idol » En línea

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

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Estructuras y reservar memoria
« Respuesta #4 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.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
reservar memoria para punteros en C « 1 2 3 »
Programación C/C++
Ghalad 23 18,937 Último mensaje 1 Junio 2010, 20:54 pm
por Ghalad
Reservar memoria con new a una clase con varios elementos y constructor.
Programación C/C++
anonimo12121 7 4,420 Último mensaje 17 Febrero 2012, 15:39 pm
por naderST
[Resuelto] Memoria dinamica con Estructuras
Programación C/C++
petita 4 3,018 Último mensaje 20 Julio 2013, 19:34 pm
por petita
Ayuda al reservar memoria con calloc
Programación C/C++
agrichi 1 2,027 Último mensaje 13 Diciembre 2017, 18:24 pm
por CalgaryCorpus
Puteros dobles y cadena de caracterez reservar memoria dinamica
Programación C/C++
Iclax 1 6,641 Último mensaje 19 Agosto 2022, 16:55 pm
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines