Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda malloc, reserva dinámica de memoria

Estas en el tema de Duda malloc, reserva dinámica de memoria en el foro de C/C++ en Foros del Web. Acabo de empezar con la reserva dinámica de memoria y no logro entenderlo del todo, ¿podríais echarme una mano? El programa debe duplicar las letras ...
  #1 (permalink)  
Antiguo 25/11/2012, 07:12
Avatar de rodrigoemece  
Fecha de Ingreso: septiembre-2011
Mensajes: 68
Antigüedad: 13 años, 2 meses
Puntos: 1
Busqueda Duda malloc, reserva dinámica de memoria

Acabo de empezar con la reserva dinámica de memoria y no logro entenderlo del todo, ¿podríais echarme una mano?

El programa debe duplicar las letras de una palabra introducida y devolver el número de letras de la original. Todo ello desde una función (Duplicar()). La función también debe reservar memoria dinámica para la nueva palabra.

¿Debo reservar memoria para la primera palabra también? ¿La reserva de memoria la debo de hacer en la función o en el main? Tal como tengo el programa ahora no devuelve la palabra duplicada a no ser que lo ponga así:
(Quitando free(palabra2) y escribiendo *palabra2=(char *)malloc(*nl*sizeof(char)+1); en vez de palabra2=(char *)malloc(*nl*sizeof(char)+1);)
Código C:
Ver original
  1. void Duplicar(char *palabra, char *palabra2, int *nl)
  2. {
  3.     int i=0;
  4.     int j=0;
  5.    
  6.     while(palabra[i]!='\0') i++;        
  7.     *nl=i;
  8.     i=0;
  9.     *palabra2=(char *)malloc(*nl*sizeof(char)+1);  
  10.     while(palabra[i]!='\0')
  11.     {
  12.         palabra2[j]=palabra[i];
  13.         j++;
  14.         palabra2[j]=palabra[i];
  15.         i++;
  16.         j++;
  17.     }  
  18.     palabra2[j]='\0';    
  19. }

Así que intuyo que el problema está en malloc y como lo utilizo, muchas gracias por vuestra ayuda.

Código C:
Ver original
  1. #include <stdio.h>
  2. #define LNX 9999
  3. void Duplicar(char *, char *, int *);
  4.  
  5. main()
  6. {
  7.     char word[LNX],word2[LNX];
  8.     int letras=0;
  9.     printf("Introduza a palabra a duplicar: ");
  10.     gets(word);
  11.     Duplicar(word,word2,&letras);
  12.     printf("\nA palabra duplicada e: %s",word2);
  13.     printf("\nO numero de letras da palabra orixinal e: %d",letras);
  14.    return 0;
  15.    
  16. }
  17.  
  18. void Duplicar(char *palabra, char *palabra2, int *nl)
  19. {
  20.     int i=0;
  21.     int j=0;
  22.    
  23.     while(palabra[i]!='\0') i++;        
  24.     *nl=i;
  25.     i=0;
  26.     palabra2=(char *)malloc(*nl*sizeof(char)+1);  
  27.     while(palabra[i]!='\0')
  28.     {
  29.         palabra2[j]=palabra[i];
  30.         j++;
  31.         palabra2[j]=palabra[i];
  32.         i++;
  33.         j++;
  34.     }  
  35.     palabra2[j]='\0';
  36.    
  37.     free(palabra2);
  38.  
  39. }

Última edición por rodrigoemece; 25/11/2012 a las 07:20
  #2 (permalink)  
Antiguo 25/11/2012, 17:25
Avatar de ZeKi  
Fecha de Ingreso: noviembre-2012
Ubicación: Jaén
Mensajes: 61
Antigüedad: 12 años
Puntos: 6
Respuesta: Duda malloc, reserva dinámica de memoria

Primeramente, es obvio que si haces el free(palabra2); no va a funcionar puesto que estás liberando el puntero que guarda la palabra duplicada (recordemos que lo que le estamos pasando a la función es un puntero, no una copia) por lo que todo lo que hagas con ese puntero dentro de la función se mantendrá a la salida.

Luego el tema de *palabra2 en la reserva de memoria. Tienes que usar el asterisco en la asignación del malloc debido a que de esta forma le indicas al compilador el tamaño que tiene lo que está apuntando el puntero, si no lo usas estarías trabajando con la propia variable puntero y no con lo que apunta.
  #3 (permalink)  
Antiguo 26/11/2012, 18:12
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: Duda malloc, reserva dinámica de memoria

Hola,

imagino que nl es el tamaño de palabra, por lo que puedes evitar pasarlo por referencia.

No tiene ningún sentido usar la función malloc (también podrías usar calloc) dentro del bucle, ya que en cada iteración estarías solicitando un nuevo espacio de memoria y dejando "perdida" la que solicitaste en la iteración anterior (es decir, que estás provocando "lacks" o "fugas" de memoria. Algo nada deseable). Tan importante es controlar la solicitud de memoria como la posterior liberación de la misma.

Código C:
Ver original
  1. #include <stdlib.h>
  2.  
  3. void *calloc(size_t nmemb, size_t size);
  4. void *malloc(size_t size);
  5. void free(void *ptr);

Un saludo,
gonzo

p.d.: recuerda que el tamaño de palabra2 es el doble que el de palabra
  #4 (permalink)  
Antiguo 30/11/2012, 08:39
Avatar de rodrigoemece  
Fecha de Ingreso: septiembre-2011
Mensajes: 68
Antigüedad: 13 años, 2 meses
Puntos: 1
Respuesta: Duda malloc, reserva dinámica de memoria

Muchas gracias a todos

Etiquetas: int, malloc, memoria, programa, reserva
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:39.