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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Retornar punteros char? ¿Si o si memoria dinamica?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Retornar punteros char? ¿Si o si memoria dinamica?  (Leído 5,574 veces)
Xargam

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Retornar punteros char? ¿Si o si memoria dinamica?
« en: 23 Junio 2018, 22:00 pm »

Hola comunidad tengo dificultades con las funciones al retornar un puntero a char o asignandolos a un doble puntero pasado por parametro. ¿Si uno declara una cadena en una funcion y quiere llevarla a main, si un puntero toma esa cadena se desapila igual?


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Retornar punteros char? ¿Si o si memoria dinamica?
« Respuesta #1 en: 24 Junio 2018, 22:52 pm »

Depende de cómo se haya declarado esa cadena.
Si es memoria dinámica, obtenida con malloc o new en C++, puedes devolverla (recordando que habrá que liberarla posteriormente).

Si hablamos de C++, y son cadenas de tipo std:.string o en general, un std::vector o cualquier otra clase del estilo, podrás retornarla sin problemas.


En línea

Xargam

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Retornar punteros char? ¿Si o si memoria dinamica?
« Respuesta #2 en: 24 Junio 2018, 23:36 pm »

Estoy trabajando en ANSI C , y realmente andar devolviendo cadenas dinamicas cada vez que le pido al usuario es muy molesto, no hay alguna forma de no usar memoria dinamica? Por que tengo una funcion que parsea y no carga memoria dinamica a una estructura, si yo luego quiero cargar mas cadenas a la estructura las cargaria dinamicas y tendria que liberar algunas.... Se vuelve loco  uno si anda devolviendo punteros dinamicos a cada rato y encima se mezclan cpn punteros estaticos.. Debe haber alguna manera en C de poder devolver cadenas
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Retornar punteros char? ¿Si o si memoria dinamica?
« Respuesta #3 en: 24 Junio 2018, 23:43 pm »

no lo hay, justo el punto para el que se usa C es para tener mucho control a bajo nivel y en el control de asignación de memoria, el string no es un tipo, el string no es más que un array de char y ha de ser manejado como tal
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Xargam

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Retornar punteros char? ¿Si o si memoria dinamica?
« Respuesta #4 en: 24 Junio 2018, 23:48 pm »

Para retornar un puntero a char no queda otra que usar memoria dinamica?
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Retornar punteros char? ¿Si o si memoria dinamica?
« Respuesta #5 en: 25 Junio 2018, 21:04 pm »

Otra opción, y véase que esta tiene sus contras, es tenes un array static en la función:

Código
  1. char* func(){
  2.    static char arr[50];
  3.  
  4.    arr[0] = 'H';
  5.    arr[1] = 'o';
  6.    arr[2] = 'l';
  7.    arr[3] = 'a';
  8.    arr[4] = '\0';
  9.  
  10.    return arr;
  11. }

Una variable static en una función no va a liberarse cuando la función haya retornado, así que puedes retornar su dirección de memoria sin problema.
Si hicieras esto con memoria dinámica, tendrías que recordar el liberarla entre llamadas, o cuando fuera necesario,
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Retornar punteros char? ¿Si o si memoria dinamica?
« Respuesta #6 en: 25 Junio 2018, 21:54 pm »

Si tan molesto es usa una cadena global como dato auxiliar. En la función lo cargas con la respuesta del usuario y una vez que regrese copias la información que hay en el buffer que te interese.
O pasas como parámetro el buffer de interés a la función y que esta solo se encargue de llenarlo.
Hay más formas conseguir una cadena en una función y retornarla después.
En línea

ThunderCls


Desconectado Desconectado

Mensajes: 455


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Retornar punteros char? ¿Si o si memoria dinamica?
« Respuesta #7 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
  1. char mystr[MAX_PATH];
  2. char *ptr = MyFunction();
  3. if(ptr != null)
  4. // evita bof
  5. 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
  1. std::string mystr = MyFunction();

Saludos
« Última modificación: 26 Junio 2018, 18:28 pm por ThunderCls » En línea

-[ "…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/
srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Retornar punteros char? ¿Si o si memoria dinamica?
« Respuesta #8 en: 26 Junio 2018, 18:38 pm »

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

Pero eso no funciona en C.
En línea

ThunderCls


Desconectado Desconectado

Mensajes: 455


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Retornar punteros char? ¿Si o si memoria dinamica?
« Respuesta #9 en: 26 Junio 2018, 19:57 pm »

Pero eso no funciona en C.

Nope por eso esta tachado  ;)
En línea

-[ "…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/
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
quien me puede ayudar a pasar este codigo con punteros y memoria dinamica
Programación C/C++
attackers 3 2,727 Último mensaje 23 Noviembre 2011, 13:04 pm
por attackers
Punteros y memoria dinamica
Programación C/C++
bemone 4 2,532 Último mensaje 30 Agosto 2015, 03:13 am
por geeke
[AYUDA] retornar un char * valido
Programación C/C++
bash 4 2,370 Último mensaje 22 Abril 2016, 14:45 pm
por MAFUS
Consutla sobre un problema con punteros y memoria dinamica.
Programación C/C++
Arturo400 1 1,726 Último mensaje 22 Septiembre 2016, 22:15 pm
por AlbertoBSD
Consulta sobre punteros y memoria dinámica
Programación C/C++
ing_maipu 5 4,028 Último mensaje 18 Octubre 2017, 19:21 pm
por ing_maipu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines