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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


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

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Problema memoria dinámica y ficheros en c
« en: 18 Diciembre 2015, 12:34 pm »

Hola, estoy haciendo un programa en c y tengo un problema, tengo que leer de un archivo de texto unos valores  y meterlos en una memoria dinámica.

Lo que hago es reservar memoria para tantos valores como haya en el fichero de texto (si hay 4 valores reservo memoria para esos 4).

Con un bucle voy leyendo valor a valor y metiéndolos en cada posición de la memoria dinámica, al finalizar de meter todos los valores libero la memoria. Hasta todo bien (creo) ya que guarda los valores.

Pero luego, más alante en el programa tengo que guardar más variables en memoria dinámica, para ello hago otra vez una llamada a malloc y reservo con el mismo nombre que reserve anteriormente. (osea se van a guardar en el mismo vector). Y cuando hago la reserva los valores de antes se me borran, los que leí del texto.

Espero haberme explicado correctamente

1º llamada a reservar memoria, leyendo de un fichero.

Código:
 posiciones = (int*) malloc (aux22 * sizeof (int));
                        if (posiciones == NULL) {
                            printf("Error al reservar memoria. ");
                            return 1;
                        }
                    }
                    if (aux23 < aux22) {
                        fscanf(f, "%i", &posiciones[aux23]);
                        aux23++;

2º llamada a reservar memoria, leyendo variables metidas por teclado.

Código:
posiciones = (int*) malloc (aux22 * sizeof (int));
            if (posiciones==NULL){
                printf ("error al reservar memoria");
            }
            aux24++;
            aux26++;
            posiciones[aux28]=aux24;
            aux28++;
            posiciones[aux28]=aux25;
            aux28++;
            posiciones[aux28]=aux26;
            aux28++;
            posiciones[aux28]=aux27;
            aux28++;
            free(posiciones);
            aux29=0;
        }

Los codigos no son completos, no he metido todo el bucle.

Muchas gracias, espero que me podais ayudar


« Última modificación: 18 Diciembre 2015, 12:39 pm por kraiked » En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Problema memoria dinámica y ficheros en c
« Respuesta #1 en: 18 Diciembre 2015, 13:40 pm »

Hola, es normal lo que te ocurre. Piensa que lo que hace malloc es buscar un bloque de memoria libre del tamaño que desees, y devolver un puntero a su primera posición. En el primer caso, pides un bloque de 4 y lo llenas con los valores del archivo. Luego cuando vuelves a llamar a malloc, éste te devuelve otro bloque de memoria diferente y como usas el mismo puntero, la dirección a tu bloque de memoria de 4 posiciones la pierdes.

Lo que tendrías que hacer es usar realloc, el cual te permite modificar un bloque de memoria existente, ampliando o disminuyendo la cantidad de elementos reservados. Así que al principio harías un malloc para reservar un bloque de 4 elementos, y luego tendrías que usar realloc para ampliar ese mismo bloque de memoria hasta los elementos que necesites.

Saludos!


En línea

kraiked

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Re: Problema memoria dinámica y ficheros en c
« Respuesta #2 en: 18 Diciembre 2015, 14:33 pm »

Muchas gracias, era eso, ya cambie la función por realloc y funcionaa correctamente.

Otra cosa, con realloc no tengo que liberar memoria hasta que no termine el programa verdad? osea, amplio la memoria en 4 posiciones más con realloc, entonces son 8 y luego quiero volver a ampliar la memoria en otras 4 posiciones para que sean 12, por tanto no he de liberar la memoria ¿no?. Solo cuando no vaya a ampliar más memoria ¿no?
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Problema memoria dinámica y ficheros en c
« Respuesta #3 en: 18 Diciembre 2015, 14:57 pm »

Tienes que liberar la memoria con free cuando ya no necesites más ese bloque de memoria, que en tu caso es el apuntado por posiciones.

posiciones primero no apunta a nada, luego apunta a un bloque de 8 enteros cuando le reservas memoria con malloc, luego apunta a un bloque de 12 enteros cuando amplias con realloc. A partir de ahí, usas esos elementos a tu antojo y cuando no necesites más esos elementos, es cuando liberas haciendo free(posiciones);.
En línea

kraiked

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Re: Problema memoria dinámica y ficheros en c
« Respuesta #4 en: 18 Diciembre 2015, 17:12 pm »

Muchas gracias por tu ayuda :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines