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

Función y devolver puntero

Estas en el tema de Función y devolver puntero en el foro de C/C++ en Foros del Web. Buenas, ya siento que abuso un poco del foro, hago preguntas a las tantas. La cosa es, tengo una función, un ejemplo hipotético y no ...
  #1 (permalink)  
Antiguo 18/12/2012, 01:58
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Función y devolver puntero

Buenas, ya siento que abuso un poco del foro, hago preguntas a las tantas. La cosa es, tengo una función, un ejemplo hipotético y no real a lo que quiero hacer aquí:

Código C:
Ver original
  1. int main (void)
  2. {
  3.     char *nombre = char *depends = depends_parser();
  4. }
  5.  
  6. char *mi_nombre()
  7. {
  8.     char *nombre;
  9.     nombre = malloc(sizeof(char)*strlen("Beto")+1);
  10.     if (nombre == NULL)
  11.     {
  12.         exit(EXIT_FAILURE);
  13.     }
  14.    
  15.     sprintf(nombre, "Beto");
  16.  
  17.     return nombre;
  18. }

Todo perfecto, el problema es que la función esta retornando un puntero, si lo dejo así funcionara perfecto, pero no estoy haciéndole free() a nombre, entonces queda el espacio sin liberarse. ¿En este caso, como haría?

Saludos y gracias de ante mano.

Última edición por guzzano; 18/12/2012 a las 02:09
  #2 (permalink)  
Antiguo 18/12/2012, 02:09
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Función y devolver puntero

Supongo que cuando llames a esa función recoges el valor en una variable de tipo char*, esa es la que debes liberar.
  #3 (permalink)  
Antiguo 18/12/2012, 02:15
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Función y devolver puntero

Cita:
Iniciado por Heimish2000 Ver Mensaje
Supongo que cuando llames a esa función recoges el valor en una variable de tipo char*, esa es la que debes liberar.
Gracias por la respuesta. Curiosamente, funciona perfecto, pero el debuger me dice que todavía esta bloqueado ese espacio en la memoria, así libere al puntero que esta recibiendo el retorno de la función.

PD; Me equivoque en el código de arriba, es:
Código C:
Ver original
  1. char *nombre = depends_parser();
  #4 (permalink)  
Antiguo 18/12/2012, 02:18
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Función y devolver puntero

Efectivamente, lo que estas haciendo es reservar un bloque de memoria en la linia 9 y guardas la dirección del bloque en la variable nombre. Esta dirección es la que devuelve la función. Si quieres liberar esa memoria bastaría con algo así:
Código:
// Guardamos la dirección de memoria en la varibale "name"
char *name = mi_nombre();

// Trabajamos con la variable "name"
// ...

// liberamos la memoria
free(name);
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 18/12/2012, 02:24
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Función y devolver puntero

Listo! muchisimas gracias, fue un error mio con los datos que le di el debugger. Ahora, el problema como tal es hacer esto:

Código C:
Ver original
  1. char *nombre = mi_nombre();
  2. puts(mi_nombre)

Según leí es muy mala idea, de paso el debugger (ahora si, con los parametros bien, me manda error) preguntaré, ¿por qué es malo esto?

Los datos del debugger:
Código HTML:
Ver original
  1. ==7991== HEAP SUMMARY:
  2. ==7991==     in use at exit: 0 bytes in 0 blocks
  3. ==7991==   total heap usage: 16 allocs, 16 frees, 197,588 bytes allocated
  4. ==7991==
  5. ==7991== All heap blocks were freed -- no leaks are possible
  6. ==7991==
  7. ==7991== Use --track-origins=yes to see where uninitialised values come from
  8. ==7991== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
  9. ==7991==
  10. ==7991== 1 errors in context 1 of 2:
  11. ==7991== Conditional jump or move depends on uninitialised value(s)
  12. ==7991==    at 0x40BB529: ??? (in /lib/libc-2.16.so)
  13. ==7991==    by 0x80488CF: main (in /home/guzzano/pkgrmd/pkgrmd)
  14. ==7991==
  15. ==7991==
  16. ==7991== 1 errors in context 2 of 2:
  17. ==7991== Invalid read of size 4
  18. ==7991==    at 0x40BB51B: ??? (in /lib/libc-2.16.so)
  19. ==7991==    by 0x80488CF: main (in /home/guzzano/pkgrmd/pkgrmd)
  20. ==7991==  Address 0x42176ec is 4 bytes inside a block of size 6 alloc'd
  21. ==7991==    at 0x402A66D: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
  22. ==7991==    by 0x8048BE4: search_package (in /home/guzzano/pkgrmd/pkgrmd)
  23. ==7991==    by 0x80488CF: main (in /home/guzzano/pkgrmd/pkgrmd)
  24. ==7991==
  25. ==7991== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

Funciona perfecto, puts envia la cadena perfectamente a la pantalla, pero en lo que es el debugger me dice que tengo unos errores, ¿por qué pasa tal cosa?


Muchas gracias a todos por las respuestas,
saludos.
  #6 (permalink)  
Antiguo 20/12/2012, 02:26
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Función y devolver puntero

Somos programadores, no adivinos. Sin poner el código del programa poco vamos a poder decirte...
__________________
Aviso: No se resuelven dudas por MP!
  #7 (permalink)  
Antiguo 20/12/2012, 05:09
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Función y devolver puntero

Disculpa, igual esta de más lo de adivino. El código es el mismo.

Código C:
Ver original
  1. int main (void)
  2. {
  3.     char *nombre = depends_parser();
  4.     puts(nombre);
  5. }
  6.  
  7. char *mi_nombre()
  8. {
  9.     char *nombre;
  10.     nombre = malloc(sizeof(char)*strlen("Beto")+1);
  11.     if (nombre == NULL)
  12.     {
  13.         exit(EXIT_FAILURE);
  14.     }
  15.    
  16.     sprintf(nombre, "Beto");
  17.  
  18.     return nombre;
  19. }


Saludos y disculpen.

Última edición por guzzano; 20/12/2012 a las 05:17
  #8 (permalink)  
Antiguo 20/12/2012, 12:29
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Función y devolver puntero

Me perdi un poco, el problema lo tenes en el ultimo codigo que subiste??? o al querer hacer:
Código C:
Ver original
  1. char *nombre = mi_nombre();
  2.     puts(mi_nombre);  /* <--- ojo le estas pasando la direccion de una funcion */
??

Saludos

PD: faltaria hacer un free(nombre);

Etiquetas: devolver, funcion, puntero
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 04:39.