Ayuda puntero

Iniciado por kworld, 23 Mayo 2010, 04:47 AM

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

kworld

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 ?


#include <windows.h>

int getSecureUserProfile(unsigned char* up);

int main(int argc, char* argv)
{
    unsigned char* up = NULL;
    if (getSecureUserProfile(up))
    {
      printf("Fuera:%s\n",up);
      free(up);
    }
   
   
}

int getSecureUserProfile(unsigned char* up)
{
  int ret;
  unsigned int tam;
 
  ret = 0;
  tam = GetWindowsDirectory(NULL, 0);
 
  up = (unsigned char*) malloc (tam * sizeof(*up));
 
  if (up != NULL)
  {
      GetWindowsDirectory(up, tam);
      ret = 1;
      printf("Dentro:%s\n",up);
  }

  return ret;
 
}



leogtz

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

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:

int getSecureUserProfile(unsigned char* up);


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

char *funcion(unsigned char *p);

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Littlehorse

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!


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

do-while

¡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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

kworld

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

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


#include <windows.h>

int getSecureUserProfile(unsigned char** up);

int main(int argc, char* argv)
{
    unsigned char* up = NULL;
    unsigned char** pup = &up;
   
    if (getSecureUserProfile(pup))
    {
      printf("Fuera:%s\n",up);
      free(up);
    }
   
    getchar();
    return 0;
}

int getSecureUserProfile(unsigned char** up)
{
  int ret;
  unsigned int tam;

  ret = 0;
  tam = GetWindowsDirectory(NULL, 0);
 
  *up = (unsigned char*) malloc (tam * sizeof(*up));
 
  if (*up != NULL)
  {
      GetWindowsDirectory(*up, tam);
      ret = 1;
      printf("Dentro:%s\n",*up);
  }

  return ret;

}


nicolas_cof

Te estarian faltando declarar las siguientes librerias...

#include <stdio.h> // getchar() printf()
#include <stdlib.h> // malloc() free()


Salu10.