Das Übergeben einer Struktur an eine Funktion funktioniert nicht [duplizieren]

Aug 16 2020

Im folgenden Code habe ich neben main eine Funktion erstellt, um das int innerhalb einer Struktur in zwei Hälften zu teilen.

Danach möchte ich den neuen Wert ausdrucken. Der Ausdruckwert ist jedoch immer noch der alte.

Ich glaube, mein grundlegendes Wissen über Struktur und Zeiger ist nicht gut genug.

Kann mir jemand dabei helfen? Vielen Dank!!!

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

}

Antworten

1 Miket25 Aug 16 2020 at 07:56

Die Funktion divideändert eine Kopie dieser Struktur, da Strukturen als Wert übergeben werden. Sie müssen den Zeiger an die Struktur übergeben, damit die Funktion das Original ändern kann.

void divide(person* A)
{
    person half;

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

Wird dividemit der Adresse der ursprünglichen Struktur aufgerufen

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

Wenn Sie an übergeben A, dividewird eine Kopie von Aerstellt. Das Ändern dieser Kopie im Inneren dividehat keine Auswirkungen auf die lokale Variable, in der ASie definiert haben main. Um dies zu beheben, können divideSie einen Zeiger auf setzen person. Ein Zeiger stellt effektiv eine Adresse im Speicher dar, sodass Sie damit beispielsweise auf lokale Variablen zugreifen können, die in anderen Funktionen definiert sind, auf die sonst nicht zugegriffen werden kann (recherchieren Sie Stapelrahmen, wenn Sie verstehen möchten, warum dies so ist).

In der Praxis ändern Sie also die divideSignatur in: void divide(person *A)und in der letzten Zeile dieser Funktion geben Sie mit dem Dereferenzierungsoperator nicht an, Asondern auf alles, worauf Sie verweisen A: *A = half. In Ihrer mainFunktion übergeben Sie dann die Adresse von Aanstelle von sich Aselbst an dividedie Adresse des Operators : divide(&A).

BEARBEITEN: Noch besser, Sie können das Erstellen des Temporären vermeiden, halfindem Sie direkt ausführen: A->age /= 2und A->wage /= 2wo A.xist syntaktischer Zucker für (*A).x.