pasar una estructura a una función no funciona [duplicar]

Aug 16 2020

En el siguiente código, he creado una función además de main para dividir el int dentro de una estructura por la mitad.

Después de eso, quiero imprimir el nuevo valor. Sin embargo, el valor de impresión sigue siendo el anterior.

Creo que mi conocimiento fundamental de estructuras y punteros no es lo suficientemente bueno.

Puede alguien ayudarme con esto? ¡¡¡Muchas gracias!!!

typedef struct{
    int age;
    int wage;
}person;


void divide(person A)
{
    person half;
    half.age = A.age / 2;
    half.wage = A.wage / 2;
    
    A = half;
}

int main(void)
{
    person A;
    A.age = 30;
    A.wage = 35000;
    
    divide(A);
    
    printf("%i\n", A.age);

}

Respuestas

1 Miket25 Aug 16 2020 at 07:56

La función divideestá modificando una copia de esa estructura ya que las estructuras se pasan por valor. Deberá pasar el puntero a la estructura para que la función pueda modificar el original.

void divide(person* A)
{
    person half;

    half.age  = A->age  / 2;
    half.wage = A->wage / 2;
    
    *A = half;
}

Llamado dividecon dirección de estructura original

divide(&A);
2 Peter Aug 16 2020 at 08:05

Cuando pasa Aa divide, Ase crea una copia de . La modificación de esta copia en el interior divideno tiene ningún efecto en la variable local Aque definió en main. Para remediar esto, puede hacer que dividetome un puntero a person. Un puntero representa efectivamente una dirección en la memoria de modo que pueda usarla, por ejemplo, para acceder a variables locales definidas en otras funciones que de otro modo no serían accesibles ( busque marcos de pila si quiere entender por qué es así).

Por lo que en la práctica se cambia dividela firma 's a: void divide(person *A)y en la última línea de esta función no assing a A, pero a lo que Ase apunta a mediante el operador de eliminar la referencia: *A = half. En su mainfunción, a continuación, pasa la dirección del Alugar de Así mismo a dividetravés de la dirección del operador: divide(&A).

EDITAR: aún mejor, puede evitar crear el temporal halfrealizando directamente: A->age /= 2y A->wage /= 2dónde A.xestá el azúcar sintáctico (*A).x.