passare una struttura a una funzione non funziona [duplicato]
Nel codice seguente ho creato una funzione oltre a main per dividere l'int all'interno di una struttura a metà.
Dopodiché, voglio stampare il nuovo valore. Tuttavia, il valore di stampa è ancora quello vecchio.
Credo che la mia conoscenza fondamentale di struct e pointers non sia abbastanza buona.
Qualcuno mi può aiutare con questo? Molte grazie!!!
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);
}
Risposte
La funzione divide
sta modificando una copia di quella struttura poiché le strutture vengono passate per valore. Dovrai passare il puntatore alla struttura, in modo che la funzione possa modificare l'originale.
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
Chiamato divide
con indirizzo di struttura originaria
divide(&A);
Quando si passa A
a divide
, A
viene creata una copia di . La modifica di questa copia all'interno divide
non ha alcun effetto sulla variabile locale A
definita in main
. Per rimediare a questo, puoi divide
prendere un puntatore a person
. Un puntatore rappresenta effettivamente un indirizzo in memoria in modo tale da poterlo utilizzare, ad esempio, per accedere a variabili locali definite in altre funzioni che altrimenti non sarebbero accessibili (cerca gli stack frame se vuoi capire il motivo).
Quindi, in pratica si cambia divide
's firma: void divide(person *A)
e l'ultima riga di questa funzione non assing a A
, ma a tutto ciò che A
sta puntando al utilizzando l'operatore dereference: *A = half
. Nella vostra main
funzione è quindi passa l' indirizzo del A
posto di A
sé per divide
utilizzando l'indirizzo dell'operatore: divide(&A)
.
EDIT: ancora meglio, puoi evitare di creare il temporaneo half
eseguendo direttamente: A->age /= 2
e A->wage /= 2
dove A.x
sta lo zucchero sintattico (*A).x
.