¿Cómo cambiar el valor de la variable pasada como argumento?

Resuelto Jack asked hace 12 años • 4 respuestas

¿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.

Jack avatar Feb 27 '12 10:02 Jack
Aceptado

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 charpuntero).

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 baaes porque simplemente está asignando un nuevo valor a la variable localchar *foo , que no está relacionada con x. Por lo tanto el valor de xnunca se modifica.

AusCBloke avatar Feb 27 '2012 03:02 AusCBloke

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 foola 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 xcomo 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.

Jonathan Leffler avatar Feb 27 '2012 03:02 Jonathan Leffler

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 inttipos 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
R Sahu avatar Mar 15 '2016 21:03 R Sahu