meneruskan struct ke suatu fungsi tidak berhasil [duplikat]

Aug 16 2020

Pada kode di bawah ini saya telah membuat fungsi selain main untuk membagi int di dalam struct menjadi dua.

Setelah itu, saya ingin mencetak nilai baru. Namun nilai print outnya tetap yang lama.

Saya percaya pengetahuan fundamental saya tentang struct dan pointer tidak cukup baik.

Adakah yang bisa membantu saya dengan ini? Terima kasih banyak!!!

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

}

Jawaban

1 Miket25 Aug 16 2020 at 07:56

Fungsinya divideadalah memodifikasi salinan struktur itu karena struktur adalah nilai yang lewat. Anda harus meneruskan penunjuk ke struktur, sehingga fungsi tersebut dapat mengubah aslinya.

void divide(person* A)
{
    person half;

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

Disebut dividedengan alamat struktur asli

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

Saat Anda meneruskan Ake divide, salinan dari Adibuat. Memodifikasi salinan di dalam divideini tidak berpengaruh pada variabel lokal yang AAnda tentukan main. Untuk memperbaiki hal ini, Anda dapat membuat dividemengambil pointer ke person. Sebuah pointer secara efektif merepresentasikan sebuah alamat dalam memori sehingga Anda dapat menggunakannya untuk misalnya mengakses variabel lokal yang didefinisikan dalam fungsi lain yang tidak dapat diakses (riset stack frame jika Anda ingin memahami mengapa hal ini terjadi).

Jadi dalam praktek Anda mengubah dividetanda tangan 's ke: void divide(person *A)dan di baris terakhir fungsi ini Anda assing tidak Atapi apa pun Amenunjuk ke dengan menggunakan operator dereference: *A = half. Dalam Anda mainfungsi yang kemudian lulus alamat dari Abukan Adirinya untuk dividemenggunakan alamat operator: divide(&A).

EDIT: bahkan lebih baik, Anda dapat menghindari membuat sementara halfdengan langsung melakukan: A->age /= 2dan di A->wage /= 2mana A.xgula sintaksis untuk (*A).x.