Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MRx86 en 16 Noviembre 2016, 20:05 pm



Título: porque "no es bueno" retornar strings por funciones en C?
Publicado por: MRx86 en 16 Noviembre 2016, 20:05 pm
Hola

toda la vida he visto que aconsejan no usar strings como valor de retorno de funciones (esto es en C, nunca lo he visto en C++, aunque creo que recuerdo haber leido que este problema de no poder retornar cadenas por funciones se arreglo en C++), y siempre he seguido este consejo retornando siempre las cadenas por buffers pasados por parametro (mal hecho, al no haber investigado el porque se recomienda esto).

Y viendo el siguiente codigo:

http://foro.elhacker.net/programacion_cc/manejo_de_procesos_en_c-t82074.0.html

justamente en la linea que dice

printf("ERROR - %s",MensajeError(GetLastError()));

se ve claramente que la funcion MensajeError() retorna una cadena (en este caso el nombre del error).

y si uno se pone a convertir el codigo  a ensamblador (o ver directamente el codigo generado por un compilador, en este caso el famoso GCC) se ve que si se puede retornar una cadena sin generar errores.

la pregunta es la siguiente:

¿Porque no se recomienda retornar cadenas en C?

Saludos y gracias... :-\


Título: Re: porque "no es bueno" retornar strings por funciones en C?
Publicado por: kub0x en 16 Noviembre 2016, 20:26 pm
¿Porque no se recomienda retornar cadenas en C?

No es que no se recomienden devolver cadenas en C. Existen unas pautas que si se cumplen entonces se considera seguro devolver la cadena.

Si comparamos:

Código
  1. char* RetStr(){
  2. char str[] = "Hola";
  3. return str;
  4. }

Código
  1. char* RetStr(){
  2. char * str = (char*)malloc(5);
  3. strcpy(str,"Hola\0");
  4. return str;
  5. }

La primera reserva un char * en la stack (pila) y al hacer return como bien sabemos los valores de la función en la pila salen. El valor de la dirección de memoria de la variable str no tendrá sentido alguno.
En el segundo reservamos memoria en el heap dinamicamente, al devolver el valor los valores de la pila salen pero el heap se mantiene intacto por lo tanto no tenemos perdida de significado.

Saludos!