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)
| | |-+  Ayuda puntero
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda puntero  (Leído 3,143 veces)
kworld

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Ayuda puntero
« en: 23 Mayo 2010, 04:47 am »

Hola. Estoy trabajando en la primera parte de una función, pero tengo un problema con un puntero de tipo unsigned char, resulta que le asigno memoria con malloc, y al salir de la función se pierde el contenido y no entiendo porqué.

¿Alguien podría ayudarme por favor, porque no logro ver el error ?

Código
  1. #include <windows.h>
  2.  
  3. int getSecureUserProfile(unsigned char* up);
  4.  
  5. int main(int argc, char* argv)
  6. {
  7.    unsigned char* up = NULL;
  8.    if (getSecureUserProfile(up))
  9.    {
  10.      printf("Fuera:%s\n",up);
  11.      free(up);
  12.    }
  13.  
  14.  
  15. }
  16.  
  17. int getSecureUserProfile(unsigned char* up)
  18. {
  19.  int ret;
  20.  unsigned int tam;
  21.  
  22.  ret = 0;
  23.  tam = GetWindowsDirectory(NULL, 0);
  24.  
  25.  up = (unsigned char*) malloc (tam * sizeof(*up));
  26.  
  27.  if (up != NULL)
  28.  {
  29.      GetWindowsDirectory(up, tam);
  30.      ret = 1;
  31.      printf("Dentro:%s\n",up);
  32.  }
  33.  
  34.  return ret;
  35.  
  36. }
  37.  



« Última modificación: 23 Mayo 2010, 04:59 am por kworld » En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Ayuda puntero
« Respuesta #1 en: 23 Mayo 2010, 06:18 am »

Los tipos de datos no coinciden, tu esperas de vuelta un vector de char, por esto:

Código:
 printf("Fuera:%s\n",up)

Es decir, tu esperas que el valor de retorno de la función quede en "up", pero lo único que puede devolver  la función etSecureUserProfile es un valor entero:

Código:
int getSecureUserProfile(unsigned char* up);

Necesitarías una función prototipo algo así:

Código:
char *funcion(unsigned char *p);

Saludos.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Ayuda puntero
« Respuesta #2 en: 23 Mayo 2010, 08:52 am »

kworld lo que sucede es que el puntero que utilizas en getSecureUserProfile tiene ámbito local a esa función. Al finalizar, ese puntero desaparece junto con la referencia de la memoria que reservaste por lo tanto no puedes utilizarla ni liberarla en pasos posteriores. Revisa el pasaje de datos por valor y por referencia.

Saludos!


En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Ayuda puntero
« Respuesta #3 en: 25 Mayo 2010, 17:11 pm »

¡Buenas!

Lo que quieres hacer es reservar memoria para el puntero que tienes en la funcion main (o cualquier otra que llame a tu funcion), pero cuando realizas la llamada a la funcion, lo que estas haciendo es copiar en la pila el valor del puntero, no el puntero en si, por lo que cualquier modificacion que hagas al parametro de la llamada se perdera cuando retornes de la funcion.

Para poder modificar valores externos a una funcion tienes que pasar puntero a las variables que quieras manipular. De esta forma lo que copias en la pila seran direcciones de memoria de variables externas a la funcion, y podras modificarlas desreferenciando los punteros.

Como bien dice littlehorse tienes que estudiar sobre el paso de parametros por valor y la simulacion de referencias en C.

En este caso en concreto, tendras que pasar a tu funcion un puntero al puntero unsigned char que quieres modificar (un doble puntero), y al desreferenciar el doble puntero dentro de la funcion, estaras manipulando el puntero externo.

Espero que te sirva.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
kworld

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: Ayuda puntero
« Respuesta #4 en: 25 Mayo 2010, 21:33 pm »

gracias LittleHorse y do-while.
Ahora logré entender.

Este es el código que ahora hace lo que quería.

Código
  1. #include <windows.h>
  2.  
  3. int getSecureUserProfile(unsigned char** up);
  4.  
  5. int main(int argc, char* argv)
  6. {
  7.    unsigned char* up = NULL;
  8.    unsigned char** pup = &up;
  9.  
  10.    if (getSecureUserProfile(pup))
  11.    {
  12.      printf("Fuera:%s\n",up);
  13.      free(up);
  14.    }
  15.  
  16.    getchar();
  17.    return 0;
  18. }
  19.  
  20. int getSecureUserProfile(unsigned char** up)
  21. {
  22.  int ret;
  23.  unsigned int tam;
  24.  
  25.  ret = 0;
  26.  tam = GetWindowsDirectory(NULL, 0);
  27.  
  28.  *up = (unsigned char*) malloc (tam * sizeof(*up));
  29.  
  30.  if (*up != NULL)
  31.  {
  32.      GetWindowsDirectory(*up, tam);
  33.      ret = 1;
  34.      printf("Dentro:%s\n",*up);
  35.  }
  36.  
  37.  return ret;
  38.  
  39. }
  40.  
En línea

nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: Ayuda puntero
« Respuesta #5 en: 26 Mayo 2010, 01:12 am »

Te estarian faltando declarar las siguientes librerias...

Código:
#include <stdio.h> // getchar() printf()
#include <stdlib.h> // malloc() free()

Salu10.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda] Problema un poco sonso al intercambiar un puntero por otro.
Programación C/C++
BlackZeroX 5 3,132 Último mensaje 13 Febrero 2011, 07:19 am
por BlackZeroX
[AYUDA] Puntero de controles
Programación Visual Basic
Miseryk 4 2,283 Último mensaje 27 Marzo 2012, 07:23 am
por BlackZeroX
Ayuda con una estructura y puntero //winsock//
Programación C/C++
str0nghack 4 2,343 Último mensaje 22 Junio 2018, 18:17 pm
por str0nghack
Puntero del ratón en un VPS
Redes
MA40 3 2,691 Último mensaje 3 Mayo 2020, 23:01 pm
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines