Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kworld en 23 Mayo 2010, 04:47 am



Título: Ayuda puntero
Publicado por: kworld 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.  



Título: Re: Ayuda puntero
Publicado por: leogtz 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.


Título: Re: Ayuda puntero
Publicado por: Littlehorse 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!




Título: Re: Ayuda puntero
Publicado por: do-while 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!


Título: Re: Ayuda puntero
Publicado por: kworld 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.  


Título: Re: Ayuda puntero
Publicado por: nicolas_cof 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.