Puntero como argumento de una funci贸n
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!!!
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!!!
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
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
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.
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.
