Puntero como argumento de una función

kuno
24 de Noviembre del 2007
Hola!!!

Tengo el siguiente código:

#include <stdlib.h>

void
funcion (char *nombre)
{
nombre = (char *) malloc (sizeof (char) * 3);
*(nombre + 0) = 's';
*(nombre + 1) = 'i';
*(nombre + 2) = '';
}

int
main (int argc, char *argv)
{
char *nombre = NULL;

funcion (nombre);

if (nombre == NULL)
printf ("Es NULLn");
else
printf ("No es NULLn");

return 0;
}

Es muy fácil. Yo le paso desde el "main" un puntero a char a la funcion "funcion". En ésta, reservo memoria y le doy un valor. Sin embargo cuando vuelve a "main" este puntero a char es NULL. ¿No debería mantener el valor, porque se pasa por referencia el valor no?

Un saludo!!!

rolan2kn
24 de Noviembre del 2007
mira, el problema es que le pasas un puntero a la funcion pero adentro creas memoria, y por lo tanto modificas la direccion del puntero, por lo que lo unico que haces es perder el puntero inicial que habias pasado por parametro al principio, para trabajar con el puntero nuevo que creaste con malloc.
Una solucion podria ser poner un ampresand luego del asterisco:

void funcion(char * &nombre); // una referencia a un puntero a char.

O si eso te parece muy denso y oscuro, puedes pasar el puntero con memoria reservada, o sea llamar malloc antes de pasar el puntero por parametro.
Salu2.

para que el puntero afuera se modifique tambien y se quede con la direccion que tome el puntero pasado por parametro


rolan2kn
24 de Noviembre del 2007
me confundi en el orden de parrafos en la respuesta anterior:

es asi:

mira, el problema es que le pasas un puntero a la funcion pero adentro creas memoria, y por lo tanto modificas la direccion del puntero, por lo que lo unico que haces es perder el puntero inicial que habias pasado por parametro al principio, para trabajar con el puntero nuevo que creaste con malloc.
Una solucion podria ser poner un ampresand luego del asterisco:

void funcion(char * &nombre); // una referencia a un puntero a char.


para que el puntero afuera se modifique tambien y se quede con la direccion que tome el puntero pasado por parametro

O si eso te parece muy denso y oscuro, puedes pasar el puntero con memoria reservada, o sea llamar malloc antes de pasar el puntero por parametro.
Salu2.