chuyển một cấu trúc đến một hàm không hoạt động [trùng lặp]

Aug 16 2020

Trong đoạn mã dưới đây, tôi đã tạo một hàm ngoài hàm main để chia int bên trong một cấu trúc thành một nửa.

Sau đó, tôi muốn in ra giá trị mới. Tuy nhiên, giá trị in ra vẫn là giá trị cũ.

Tôi tin rằng kiến ​​thức cơ bản của tôi về cấu trúc và con trỏ là không đủ tốt.

Bất cứ ai có thể giúp tôi với điều này? Cảm ơn rất nhiều!!!

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

}

Trả lời

1 Miket25 Aug 16 2020 at 07:56

Hàm divideđang sửa đổi một bản sao của cấu trúc đó vì cấu trúc được chuyển theo giá trị. Bạn sẽ cần phải chuyển con trỏ đến cấu trúc để hàm có thể sửa đổi bản gốc.

void divide(person* A)
{
    person half;

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

Được gọi dividevới địa chỉ của cấu trúc ban đầu

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

Khi bạn chuyển Ađến divide, một bản sao của Asẽ được tạo. Việc sửa đổi bản sao bên trong dividenày không ảnh hưởng đến biến cục bộ Amà bạn đã xác định main. Để khắc phục điều này, bạn có thể thực dividehiện một con trỏ tới person. Một con trỏ thể hiện một cách hiệu quả một địa chỉ trong bộ nhớ để bạn có thể sử dụng nó để truy cập vào các biến cục bộ được xác định trong các hàm khác mà nếu không thì không thể truy cập được (nghiên cứu khung ngăn xếp nếu bạn muốn hiểu tại sao lại như vậy).

Vì vậy, trong thực tế bạn thay đổi dividechữ ký 's: void divide(person *A)và ở dòng cuối cùng của chức năng này, bạn assing không Anhưng để bất cứ điều gì Ađược trỏ đến bằng cách sử dụng các toán tử tham chiếu: *A = half. Trong bạn mainchức năng bạn sau đó vượt qua địa chỉ của Athay vì Abản thân để dividesử dụng địa chỉ của nhà điều hành: divide(&A).

EDIT: thậm chí tốt hơn, bạn có thể tránh tạo ra tạm thời halfbằng cách trực tiếp thực hiện: A->age /= 2A->wage /= 2nơi A.xlà cú pháp đường cho (*A).x.