Discussion:
Paso de char * a una funcion por referencia
(demasiado antiguo para responder)
Derek
2005-05-25 07:38:33 UTC
Permalink
Hola:

Queria saber como puedo pasar un char * a una función por referencia.

Un ejemplo de lo que quiero hacer es esto:

char *cadena_a_pasar;

void Funcion(char *cadena)
{
cadena=(char *)malloc(10*sizeof(char));

// Modifcaciones en la cadena

}

Y llamo a la función así:

Funcion(&cadena_a_pasar);

Sin embargo, este código no funciona bien del todo, pues "cadena_a_pasar" no
contiene tras llamar a la función valores correctos.

Alguien me puede ayudar?. Gracias.
Zephryn Xirdal
2005-05-25 08:26:00 UTC
Permalink
Queria saber como puedo pasar un char * a una funci=F3n por referencia=
.
char *cadena_a_pasar;
void Funcion(char *cadena)
{
cadena=3D(char *)malloc(10*sizeof(char));
// Modifcaciones en la cadena
}
Funcion(&cadena_a_pasar);
Sin embargo, este c=F3digo no funciona bien del todo, pues =
"cadena_a_pasar" no
contiene tras llamar a la funci=F3n valores correctos.
Alguien me puede ayudar?. Gracias.
Es que en C no se puede pasar por referencia, y en caso de cadenas la =

forma a llamar para lo que intentas hacer es:

Funcion(cadena_a_pasar);
Oscar Garcia
2005-05-25 09:35:02 UTC
Permalink
El Wed, 25 May 2005 10:26:00 +0200, "Zephryn Xirdal"
Post by Zephryn Xirdal
Es que en C no se puede pasar por referencia, y en caso de cadenas la
Por supuesto que sí.
Post by Zephryn Xirdal
Funcion(cadena_a_pasar);
Eso es cuando la cadena está definida como char * o como char ...[].
Ya que estás pasando un puntero que apunta a la cadena de caracteres
(de modo que lo pasas por referencia porque puedes modificar el
contenido de la cadena desde dentro de la función).

Si se define como char cadena[n] entonces se pasa la cadena completa
por la pila y las modificaciones que se hagan no son devueltas (porque
se hace las modificaciones en la copia que se manda a la función).
Cuando se pasa como parámetro punteros entonces se dice que se pasan
los valores por referencia ya que aunque no podamos modificar el
puntero sí que podemos variar la zona de memoria a la que hace
referencia.

En su caso envía &cadena_a_pasar para obtener la dirección de memoria
donde se almacena el puntero. De modo que podrá modificar el contenido
del puntero al hacer el malloc.

Un saludo y buenos días.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Antoine Leca
2005-05-30 09:01:41 UTC
Permalink
Post by Zephryn Xirdal
Post by Derek
Queria saber como puedo pasar un char * a una función por referencia.
Es que en C no se puede pasar por referencia,
Cualquier cosa que quieres pasar por referencia (sea por recuperar un
resultado dentro de un variable, o por ahorrar la copía de la valor), la
pases con un puntero añadido. Para llamar la funcción, uses &.

Si es ya algo puntado, al final tienes un puntero doble, como un char**.


Antoine

Oscar Garcia
2005-05-25 08:54:57 UTC
Permalink
Post by Derek
Queria saber como puedo pasar un char * a una función por referencia.
Es decir.. quieres pasar una referencia a un char (o bien una cadena
de caracteres acabada con un \0).
Post by Derek
char *cadena_a_pasar;
void Funcion(char *cadena)
{
cadena=(char *)malloc(10*sizeof(char));
// Modifcaciones en la cadena
}
Funcion(&cadena_a_pasar);
Sin embargo, este código no funciona bien del todo, pues "cadena_a_pasar" no
contiene tras llamar a la función valores correctos.
Puf... analicemos lo que haces... estás metiendo en "cadena" (la copia
estática en la función del parámetro introducido) una reserva de
memoria. Cuando salgas de la función el parámetro de la función no
habrá cambiado porque a la función se le pasa una copia del puntero,
no una referencia al puntero.

Si quieres hacer correctamente eso debes pasar una referencia al
puntero que apunta a un char (o cadena de caracteres terminada por un
valor nulo).

Es decir:

char *cadena_a_pasar;

// Recibimos la zona de memoria donde tenemos almacenado el puntero
void Funcion(char **cadena)
{
// Apuntamos a la zona de memoria donde está el puntero
// para modificarlo
*cadena=(char *)malloc(10*sizeof(char));
// Modifcaciones en la *cadena
}

Y llamo a la función así:
Funcion(&cadena_a_pasar);

Para mayor limpieza de código te recomiendo crear una variable de
trabajo más fácil de manejar que complejas instrucciones de manejo de
punteros (por ejemplo *(*cadena)[..] o similares).

// Recibimos la zona de memoria donde tenemos almacenado el puntero
void Funcion(char **parametro)
{
char *cadena;
// Apuntamos a la zona de memoria donde está el puntero
// para modificarlo
cadena=(char *)malloc(10*sizeof(char));
*parametro = cadena;
// Modifcaciones en la cadena
}

Ahora trabajas con cadena igual que antes de ser **char.

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Loading...