passar uma estrutura para uma função não funciona [duplicar]
No código a seguir, criei uma função separada da principal para dividir o int dentro de uma estrutura pela metade.
Depois disso, quero imprimir o novo valor. No entanto, o valor de impressão ainda é o antigo.
Eu acredito que meu conhecimento fundamental de estrutura e ponteiros não são bons o suficiente.
Alguém pode me ajudar com isso? Muito obrigado!!!
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);
}
Respostas
A função divide
está modificando uma cópia dessa estrutura, pois as estruturas são passadas por valor. Você precisará passar o ponteiro para a estrutura, para que a função possa modificar o original.
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
Chamado divide
com endereço da estrutura original
divide(&A);
Quando você passa A
para divide
, uma cópia de A
é criada. Modificar esta cópia interna divide
não tem efeito na variável local que A
você definiu em main
. Para remediar isso, você pode fazer divide
um ponteiro para person
. Um ponteiro representa efetivamente um endereço na memória de forma que você possa usá-lo para, por exemplo, acessar variáveis locais definidas em outras funções que, de outra forma, não seriam acessíveis (pesquise os quadros de pilha se quiser entender o porquê).
Assim, na prática você mudar divide
de assinatura para: void divide(person *A)
e na última linha desta função não assing para A
, mas para o que A
está apontando para usando o operador dereference: *A = half
. Em sua main
função que, em seguida, passar o endereço de A
, em vez de A
si mesmo para divide
usar o endereço do operador: divide(&A)
.
EDIT: melhor ainda, você pode evitar a criação do temporário half
executando diretamente: A->age /= 2
e A->wage /= 2
onde A.x
está o açúcar sintático para (*A).x
.