Das Übergeben einer Struktur an eine Funktion funktioniert nicht [duplizieren]
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
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 divide
mit der Adresse der ursprünglichen Struktur aufgerufen
divide(&A);
Wenn Sie an übergeben A
, divide
wird eine Kopie von A
erstellt. Das Ändern dieser Kopie im Inneren divide
hat keine Auswirkungen auf die lokale Variable, in der A
Sie definiert haben main
. Um dies zu beheben, können divide
Sie 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 divide
Signatur in: void divide(person *A)
und in der letzten Zeile dieser Funktion geben Sie mit dem Dereferenzierungsoperator nicht an, A
sondern auf alles, worauf Sie verweisen A
: *A = half
. In Ihrer main
Funktion übergeben Sie dann die Adresse von A
anstelle von sich A
selbst an divide
die Adresse des Operators : divide(&A)
.
BEARBEITEN: Noch besser, Sie können das Erstellen des Temporären vermeiden, half
indem Sie direkt ausführen: A->age /= 2
und A->wage /= 2
wo A.x
ist syntaktischer Zucker für (*A).x
.