Retornar punteros char? ¿Si o si memoria dinamica?

Iniciado por Xargam, 23 Junio 2018, 22:00 PM

0 Miembros y 1 Visitante están viendo este tema.

Xargam

Cita de: ThunderCls en 26 Junio 2018, 16:41 PM
Como ya te han dicho antes, en c no hay tipo de datos string, luego solo queda trabajar con arreglos de chars (lo que viene siendo la propia imp!ementacion del tipo string). Ahora, si intentas devolver una variable local en una funcion los datos retornados seran inconsistentes e impredecibles ya que dicha variable local al salir de su ambito (funcion) sera eliminada del stack. Para lograr lo que quieres tienes un par de opciones:

1- Creas la variable en la funcion padre y la pasas como parametro por referencia

2- Usas variables globales, estáticas o memoria dinamica (como dijeron antes tienes que estar seguro de eliminarla cuando no la necesites)

3- Haces una copia de la variable retornada justo al salir de la funcion:
   Si es una cadena puedes usar strcpy, strncpy, etc. Para cualquier otro tipo de datos memcpy, copy, etc
   
Código (cpp) [Seleccionar]
char mystr[MAX_PATH];
char *ptr = MyFunction();
if(ptr != null)
// evita bof
strncpy(mystr, ptr, sizeof(mystr));


BONUS- Si trabajar estrictamente con char* no es un requisito entonces usa std::string al retornar de la funcion:
Código (cpp) [Seleccionar]
std::string mystr = MyFunction();

Saludos

Podrias mostrar un ejemplo mas detallado de la opcion 3 por favor?

ThunderCls

Para la opcion 3 ya te he puesto un codigo de ejemplo, la funcion MyFunction() es simplemente cualquier funcion que manipule un arreglo de chars local y lo devuelva:

Código (cpp) [Seleccionar]
char * MyFunction()
{
    char mystr[255] = "Hello\0";
    return mystr;   
}
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/