¿Cómo cambiar el valor de la variable pasada como argumento?
¿Cómo cambiar el valor de la variable pasada como argumento en C? Probé esto:
void foo(char *foo, int baa){
if(baa) {
foo = "ab";
} else {
foo = "cb";
}
}
y llama:
char *x = "baa";
foo(x, 1);
printf("%s\n", x);
pero imprime baa
¿por qué? gracias de antemano.
Quiere cambiar dónde char*
apunta a, por lo tanto, necesitará aceptar un argumento con foo()
un nivel más de indirección ; a char**
(puntero a un char
puntero).
Por lo tanto foo()
se reescribiría como:
void foo(char **foo /* changed */, int baa)
{
if(baa)
{
*foo = "ab"; /* changed */
}
else
{
*foo = "cb"; /* changed */
}
}
Ahora, al llamar foo()
, pasará un puntero parax
usar la dirección del operador ( &
):
foo(&x, 1);
La razón por la que se imprime su fragmento incorrecto baa
es porque simplemente está asignando un nuevo valor a la variable localchar *foo
, que no está relacionada con x
. Por lo tanto el valor de x
nunca se modifica.
Hay varios problemas:
void foo(char *foo, int baa)
{
if (baa)
foo = "ab";
else
foo = "cb";
}
Este código cambia el puntero local, pero no hace nada con él. Para copiar cadenas, debe usar strcpy()
para mantener la interfaz igual:
void foo(char *foo, int baa)
{
if (baa)
strcpy(foo, "ab");
else
strcpy(foo, "cb");
}
Sin embargo, antes de hacer eso, deberá asegurarse de que foo
la función apunte a la memoria modificable. El código de llamada debe modificarse para garantizar que:
char x[] = "baa";
foo(x, 1);
printf("%s\n", x);
Alternativamente, puede mantener x
como puntero y revisar la interfaz de funciones:
void foo(char **foo, int baa)
{
if (baa)
*foo = "ab";
else
*foo = "cb";
}
y la secuencia de llamada:
char *x = "baa";
foo(&x, 1);
printf("%s\n", x);
Ambos mecanismos funcionan, pero lo hacen de diferentes maneras. Hay diferentes conjuntos de problemas con cada uno. No existe una sola decisión de 'esto es mejor que aquello'; Cuál es mejor depende de circunstancias fuera del alcance de los fragmentos de código que se muestran.
Su pregunta tiene un título genérico. Ya tienes respuestas para tu problema específico. Voy a agregar un par de ejemplos ilustrativos de int
tipos double
.
#include <stdio.h>
void incrementInt(int* in, int inc)
{
*in += inc;
}
void incrementDouble(double* in, double inc)
{
*in += inc;
}
int main()
{
int i = 10;
double d = 10.2;
printf("i: %d, d: %lf\n", i, d);
incrementInt(&i, 20);
incrementDouble(&d, 9.7);
printf("i: %d, d: %lf\n", i, d);
}
Producción:
i: 10, d: 10.200000
i: 30, d: 19.900000