passar uma estrutura para uma função não funciona [duplicar]

Aug 16 2020

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

1 Miket25 Aug 16 2020 at 07:56

A função divideestá 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 dividecom endereço da estrutura original

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

Quando você passa Apara divide, uma cópia de Aé criada. Modificar esta cópia interna dividenão tem efeito na variável local que Avocê definiu em main. Para remediar isso, você pode fazer divideum 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 dividede assinatura para: void divide(person *A)e na última linha desta função não assing para A, mas para o que Aestá apontando para usando o operador dereference: *A = half. Em sua mainfunção que, em seguida, passar o endereço de A, em vez de Asi mesmo para divideusar o endereço do operador: divide(&A).

EDIT: melhor ainda, você pode evitar a criação do temporário halfexecutando diretamente: A->age /= 2e A->wage /= 2onde A.xestá o açúcar sintático para (*A).x.