przekazanie struktury do funkcji nie działa [duplikat]

Aug 16 2020

W poniższym kodzie utworzyłem funkcję oprócz main, aby podzielić int wewnątrz struktury na pół.

Następnie chcę wydrukować nową wartość. Jednak wartość wydruku jest nadal stara.

Uważam, że moja podstawowa znajomość struktury i wskaźników nie jest wystarczająco dobra.

Czy ktoś może mi w tym pomóc? Wielkie dzięki!!!

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);

}

Odpowiedzi

1 Miket25 Aug 16 2020 at 07:56

Funkcja dividemodyfikuje kopię tej struktury, ponieważ struktury są przekazywane przez wartość. Będziesz musiał przekazać wskaźnik do struktury, aby funkcja mogła zmodyfikować oryginał.

void divide(person* A)
{
    person half;

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

O nazwie dividez adresem oryginalnej struktury

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

Kiedy przejdziesz Ado divide, Azostanie utworzona kopia . Modyfikacja tej kopii wewnątrz dividenie ma wpływu na zmienną lokalną Azdefiniowaną w main. Aby temu zaradzić, możesz dividewziąć wskaźnik do person. Wskaźnik skutecznie reprezentuje adres w pamięci tak, że można go użyć do np. Uzyskania dostępu do zmiennych lokalnych zdefiniowanych w innych funkcjach, które w innym przypadku nie byłyby dostępne (badanie ramek stosu, jeśli chcesz zrozumieć, dlaczego tak jest).

Tak więc w praktyce zmienić divide„s podpis: void divide(person *A)aw ostatnim wierszu tej funkcji nie assing się Ajednak do tego, co Awskazuje za pomocą operatora wyłuskiwania: *A = half. W swojej mainfunkcji, którą następnie przekazać adres z Azamiast Asię do dividekorzystania adres wykonawcy: divide(&A).

EDYCJA: jeszcze lepiej, możesz uniknąć tworzenia tymczasowego half, wykonując bezpośrednio: A->age /= 2i A->wage /= 2gdzie A.xjest cukier syntaktyczny (*A).x.