pasar una estructura a una función no funciona [duplicar]
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
La función divide
está 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 divide
con dirección de estructura original
divide(&A);
Cuando pasa A
a divide
, A
se crea una copia de . La modificación de esta copia en el interior divide
no tiene ningún efecto en la variable local A
que definió en main
. Para remediar esto, puede hacer que divide
tome 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 divide
la 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 A
se apunta a mediante el operador de eliminar la referencia: *A = half
. En su main
función, a continuación, pasa la dirección del A
lugar de A
sí mismo a divide
través de la dirección del operador: divide(&A)
.
EDITAR: aún mejor, puede evitar crear el temporal half
realizando directamente: A->age /= 2
y A->wage /= 2
dónde A.x
está el azúcar sintáctico (*A).x
.